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"));
  }
});
kundante
la source
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 */
});
Shanoor
la source
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);

sadiq
la source
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 */
});
Abhinav Gajurel
la source
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"}));
gogog
la source
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