So übergeben Sie Parameter an eine Versprechen-Funktion


120

Dies mag eine dumme Frage sein, aber ich bin ein Neuling in diesem Thema. Ich arbeite an Versprechungen auf Knoten js. Und ich möchte Parameter an eine Versprechen-Funktion übergeben. Ich konnte es jedoch nicht herausfinden.

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

und die Funktion ist so etwas wie

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
Es gibt keinen Grund, das zu tun, Sie können nur definieren usernameund passwordin einem höheren Umfang
Adeneo

Aber ich rufe das Versprechen von einem anderen Modul an, und auch Benutzername und Passwort sind nicht statisch, sondern kommen vom Client. Ist es sicher, eine Art von gloabaler Variable zu definieren, die eine Funktion setzt und die andere verwendet? Besteht das Risiko, dass die Variable von einem anderen Client geändert wird?
Kundante

1
@kundante Du brauchst keine Globalen. Erfahren Sie mehr über Schließungen.
SLaks

@adeneo das Versprechen ist asynchron - was ist, wenn er die Funktion ein zweites Mal aufruft, bevor das erste Versprechen gelöst wird?
Mawg sagt, Monica am

Antworten:


230

Wickeln Sie Ihr Versprechen in eine Funktion ein, sonst wird es sofort seine Arbeit erledigen. Außerdem können Sie Parameter an die Funktion übergeben:

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

Dann benutze es:

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

Verwenden:

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

was ist someModule?
Si8

3
Es ist nur ein Beispiel aus dem OP
Shanoor

3
@ Shanoor Was ist uid? Ist es die Zeichenfolge "Sachen haben funktioniert!"?
Old Geezer

2
@OldGeezer, es ist nur eine Variable, um die Rendite aus dem Versprechen zu halten. In diesem Fall wäre das ja "Zeug hat funktioniert!".
Shanoor

Wissen Sie, wie Sie eine Funktion aus der übergeordneten Klasse innerhalb des neuen Versprechens aufrufen können?
TimeParadox

7

Ein anderer Weg ( muss versuchen ):

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
Ihr Beispiel wäre besser, wenn Sie mit einem Array oder Objekt auflösen, das Sie dekonstruieren, sodass mehrere Argumente angezeigt werden und das ausführliche Versprechen bereits wie folgt aufgelöst wird: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Ich denke, es ist falsch, da der zweite Parameter, an den übergeben thenwird, ein Rückruf zur Behandlung des Rückgabewerts der Ablehnungsfunktion ist. Anstatt zu resolve('Success!');versuchen, werden reject('Error');wir Fehler bekommen: Unhandled promise rejectionHier sehen wir die Ausgabe, weil var extraData = 'ImExtraData';es sich um eine globale Variable handelt und NICHT, weil sie mitthen
Shakiba Moshiri

Wenn Sie es nicht bestehen, können Sie nicht darauf zugreifen, da es keinen Geltungsbereich hat / wenn Sie es nicht bestehen.
Sadiq

versuchen Sie es zu entfernen und sehen, ob es funktioniert oder nicht? codepen.io/k-five/pen/ZNOvKG siehe das Konsolenprotokoll in Ihrem Browser
Shakiba Moshiri

Ich schätze Ihren Codepen, benutze aber zwei verschiedene Variablen und sehe dann den wahren Faktor! Vermeiden Sie die gleichen Variablen. Wenn nur die globale Variable gut funktioniert hat, mussten wir keine zusätzlichen Parameter übergeben.
Sadiq

0

Mit .bind () können Sie den Parameter ( this ) an die Funktion übergeben.

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

Ich habe diese Funktion, wie man es bearbeitet, um es zu akzeptieren, .then()wenn ich es in einer Schaltfläche aufrufe. ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Provider const {images} = this.state; images.map (image => {let file = image.uri; console.log (Datei); const path = " Img" + Math.floor (Math.random () * 1500); console.log ("@ IMAGE") , path); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (file);}); }; `@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </ button> Skript ist `var then_function = function (Versprechen) {neues Versprechen (Versprechen) .then (Funktion (e) {/ * Code * /})}; Funktion SaveImagesToFirebase (auflösen, ablehnen) {/ * code * / auflösen (/ * ??? * /);} `
gogog
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.