Come passare un parametro a una funzione di promessa


122

questa potrebbe sembrare una domanda stupida ma sono un principiante in questo argomento. Sto lavorando alle promesse sul nodo js. E voglio passare il parametro a una funzione di promessa. Tuttavia non sono riuscito a capirlo.

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

e la funzione è qualcosa di simile

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
Non c'è motivo per farlo, puoi semplicemente definire usernamee passwordin un ambito più alto
adeneo

Ma sto chiamando la promessa da un altro modulo, e anche il nome utente e la password non sono statici ma provengono dal lato client. È sicuro definire qualche tipo di variabile globale che una funzione imposta e l'altra utilizza. C'è il rischio che la variabile venga modificata da un altro cliente?
kundante

1
@kundante Non hai bisogno di globali. Informazioni sulle chiusure.
SLaks

@adeneo la promessa è asincrona: cosa succede se richiama la funzione una seconda volta prima che la prima promessa venga risolta?
Mawg dice di reintegrare Monica il

Risposte:


234

Avvolgi la tua Promessa in una funzione o inizierà a fare il suo lavoro subito. Inoltre, puoi passare parametri alla funzione:

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"));
    }
  });
}

Quindi, usalo:

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"));
    }
  });
};

Uso:

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

che cos'è someModule?
Si8

3
È solo un esempio dall'OP
Shanoor

3
@Shanoor Cos'è uid? È la stringa "Roba funzionante!"?
Old Geezer

2
@ OldGeezer, è solo una variabile per contenere il ritorno dalla promessa. In questo caso, sì, sarebbe "Roba funzionante!".
Shanoor

sai come chiamare una funzione dalla classe genitore all'interno della nuova promessa?
TimeParadox

7

Un altro modo (da provare ):

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
Il tuo esempio sarebbe migliore se risolvi con un array o un oggetto che decostruisci in modo che vengano mostrati più argomenti e la promessa dettagliata viene creata già risolta in questo modo: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Penso che sia sbagliato poiché il secondo parametro a cui viene passato thenè un callback per la gestione del valore di ritorno della funzione di rifiuto . Invece di resolve('Success!');provare reject('Error');Unhandled promise rejectionvar extraData = 'ImExtraData';then
Otterremo

Se non lo passi non puoi accedervi poiché non ha scopo promesso / quindi se non lo passi.
sadiq

provare a rimuoverlo e vedere se funziona o no? codepen.io/k-five/pen/ZNOvKG guarda il log della console nel tuo browser
Shakiba Moshiri

Apprezzo il tuo codice, ma usa due variabili diverse e poi vedi il fattore reale! EVITARE LA STESSA VARIABILE. Se solo la variabile globale funzionava bene, non era necessario passare un parametro aggiuntivo.
sadiq

0

Puoi usare .bind () per passare il parametro ( this ) alla funzione.

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"}));

ho questa funzione come modificarla per accettarla .then()quando la invoco in un pulsante ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Provider const {images} = this.state; images.map (image => {let file = image.uri; console.log (file); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , percorso); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (file);}); }; `@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> script è `var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code * /})}; function SaveImagesToFirebase (risolvere, rifiutare) {/ * codice * / risolvere (/ * ??? * /);} `
gogog

0

Ancora più breve

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

foo(user, pass).then(result => {
  /* process */
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.