Comment passer un paramètre à une fonction de promesse


122

cela peut sembler une question idiote, mais je suis un débutant dans ce sujet. Je travaille sur des promesses sur le nœud js. Et je veux passer un paramètre à une fonction de promesse. Cependant, je ne pouvais pas le comprendre.

someModule.someFunction.then(username, password,function(uid) {
  /*stuff */
}

et la fonction est quelque chose comme

var someFunction = new Promise(username, password, function(resolve, reject) {
  /*stuff using username, password*/
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
});

1
Il n'y a aucune raison de faire cela, vous pouvez simplement définir usernameet passworddans une portée plus élevée
adeneo

Mais j'appelle la promesse depuis un autre module, et le nom d'utilisateur et le mot de passe ne sont pas statiques mais proviennent du côté client. Est-il sûr de définir une sorte de variable gloabale qu'une fonction définit et que l'autre utilise? Y a-t-il un risque que la variable soit modifiée par un autre client?
kundante le

1
@kundante Vous n'avez pas besoin de globaux. Renseignez-vous sur les fermetures.
SLaks

@adeneo la promesse est asynchrone - et s'il invoque la fonction une seconde fois avant que la première promesse ne soit résolue?
Mawg dit de réintégrer Monica le

Réponses:


234

Enveloppez votre promesse dans une fonction ou elle commencera à faire son travail immédiatement. De plus, vous pouvez passer des paramètres à la fonction:

var someFunction = function(username, password) {
  return new Promise(function(resolve, reject) {
    /*stuff using username, password*/
    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
}

Ensuite, utilisez-le:

someModule.someFunction(username, password).then(function(uid) {
  /* stuff */
})

 

ES6:

const someFunction = (username, password) => {
  return new Promise((resolve, reject) => {
    /*stuff using username, password*/

    if ( /* everything turned out fine */ ) {
      resolve("Stuff worked!");
    } else {
      reject(Error("It broke"));
    }
  });
};

Utilisation:

someModule.someFunction(username, password).then(uid => {
  /* stuff */
});

qu'est ce que c'est someModule?
Si8

3
C'est juste un exemple de l'OP
Shanoor

3
@Shanoor Qu'est-ce que c'est uid? S'agit-il de la chaîne "Stuff working!"?
Old Geezer

2
@OldGeezer, c'est juste une variable pour contenir le retour de la promesse. Dans ce cas, oui, ce serait "Les trucs ont fonctionné!".
Shanoor

savez-vous comment appeler une fonction de la classe parent dans la nouvelle promesse?
TimeParadox le

7

Une autre façon (à essayer ):

var promise1 = new Promise(function(resolve, reject) {
  resolve('Success!');
});
var extraData = 'ImExtraData';
promise1.then(function(value) {
  console.log(value, extraData);
  // expected output: "Success!" "ImExtraData"
}, extraData);


2
Votre exemple serait meilleur si vous résolvez avec un tableau ou un objet que vous déconstruisez afin que plusieurs arguments soient affichés et que la promesse verbeuse soit créée déjà résolue comme ceci: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Je pense que c'est faux car le deuxième paramètre qui est passé thenest un rappel pour gérer la valeur de retour de la fonction de rejet . Au lieu d' resolve('Success!');essayer, reject('Error');nous obtiendrons une erreur: Unhandled promise rejectionici, nous voyons la sortie parce que var extraData = 'ImExtraData';c'est une variable globale et PAS à cause de sa transmission en utilisantthen
Shakiba Moshiri

Si vous ne le passez pas, vous ne pouvez pas y accéder car il n'a pas de portée dans la promesse / alors si vous ne le passez pas.
sadiq

essayer de le supprimer et voir si cela fonctionne ou non? codepen.io/k-five/pen/ZNOvKG voir le journal de la console dans votre navigateur
Shakiba Moshiri

J'apprécie votre codepen, mais utilisez deux variables différentes et voyez ensuite le vrai facteur! ÉVITEZ LA MÊME VARIABLE. Si seule la variable globale fonctionnait correctement, nous n'avions pas besoin de passer de paramètre supplémentaire.
sadiq

1

Encore plus court

var foo = (user, pass) =>
  new Promise((resolve, reject) => {
    if (/* condition */) {
      resolve("Fine");
    } else {
      reject("Error message");
    }
  });

foo(user, pass).then(result => {
  /* process */
});

0

Vous pouvez utiliser .bind () pour passer le paramètre ( this ) à la fonction.

var someFunction =function(resolve, reject) {
  /* get username, password*/
  var username=this.username;
  var password=this.password;
  if ( /* everything turned out fine */ ) {
    resolve("Stuff worked!");
  } else {
    reject(Error("It broke"));
  }
}
var promise=new Promise(someFunction.bind({username:"your username",password:"your password"}));

j'ai cette fonction comment l'éditer pour l'accepter .then()quand je l'invoque dans un bouton ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Fournisseur const {images} = this.state; images.map (image => {let file = image.uri; console.log (fichier); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , chemin); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (fichier);}); }; `@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> script est `var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code *) /})}; function SaveImagesToFirebase (résoudre, rejeter) {/ * code * / résoudre (/ * ??? * /);} `
gogog
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.