Jak przekazać parametr do funkcji obietnicy


122

to może wydawać się głupie pytanie, ale jestem nowicjuszem w tym temacie. Pracuję nad obietnicami w node js. I chcę przekazać parametr do funkcji obietnicy. Jednak nie mogłem tego rozgryźć.

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

a funkcja jest podobna

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
Nie ma powodu, aby to robić, możesz po prostu zdefiniować usernamei passwordw wyższym zakresie
adeneo

Ale dzwonię do obietnicy z innego modułu, a także nazwa użytkownika i hasło nie są statyczne, ale pochodzą od strony klienta. Czy można bezpiecznie zdefiniować jakąś zmienną globalną, którą ustawia jedna funkcja, a druga używa. Czy istnieje ryzyko, że zmienna zostanie zmieniona przez innego klienta?
kundante

1
@kundante Nie potrzebujesz żadnych globali. Dowiedz się o zamknięciach.
SLaks

@adeneo obietnica jest asynchroniczna - co jeśli wywoła funkcję po raz drugi, zanim pierwsza obietnica zostanie rozwiązana?
Mawg mówi, że przywróć Monikę

Odpowiedzi:


234

Umieść swoją obietnicę w funkcji lub od razu zacznie wykonywać swoją pracę. Dodatkowo możesz przekazać parametry do funkcji:

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

Następnie użyj go:

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

Posługiwać się:

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

co jest someModule?
Si8

3
To tylko przykład z OP
Shanoor

3
@Shanoor What is uid? Czy to ciąg „Rzeczy zadziałały!”?
Old Geezer,

2
@OldGeezer, to tylko zmienna zatrzymująca zwrot z obietnicy. W tym przypadku tak, byłoby to „Rzeczy zadziałały!”.
Shanoor,

czy wiesz, jak wywołać funkcję z klasy nadrzędnej w ramach nowej obietnicy?
TimeParadox

7

Inny sposób ( musisz spróbować ):

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
Twój przykład byłby lepszy, gdybyś rozstrzygnął za pomocą tablicy lub obiektu, który dekonstruujesz, tak aby wyświetlanych było wiele argumentów i utworzona jest pełna obietnica już rozwiązana: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Myślę, że to źle, ponieważ drugi parametr, który jest przekazywany, thento wywołanie zwrotne do obsługi wartości zwracanej przez funkcję odrzucania . Zamiast resolve('Success!');próbować reject('Error');Otrzymamy błąd: Unhandled promise rejectionTutaj widzimy wynik, ponieważ var extraData = 'ImExtraData';jest zmienną globalną , a NIE dlatego, że jest przekazywany za pomocąthen
Shakiba Moshiri

Jeśli go nie przejdziesz, nie możesz uzyskać do niego dostępu, ponieważ nie ma obiecanego zakresu / a jeśli go nie przejdziesz.
sadiq

spróbuj go usunąć i zobacz, czy działa, czy nie? codepen.io/k-five/pen/ZNOvKG zobacz dziennik konsoli w przeglądarce
Shakiba Moshiri

Doceniam twój kod, ale użyj dwóch różnych zmiennych, a potem zobacz prawdziwy czynnik! UNIKAJ TEJ SAMEJ ZMIENNEJ. Jeśli tylko zmienna globalna działała poprawnie, nie musieliśmy przekazywać dodatkowego parametru.
sadiq

1

Jeszcze krócej

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

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

0

Możesz użyć .bind (), aby przekazać parametr ( this ) do funkcji.

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

Mam tę funkcję, jak ją edytować, aby zaakceptować, .then()gdy wywołuję ją w przycisku ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Provider const {images} = this.state; images.map (image => {let file = image.uri; console.log (plik); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , ścieżka); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (plik);}); }; `@gogog
DevAS

Skrypt @DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> to `var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code * /})}; function SaveImagesToFirebase (rozwiązywanie, odrzucanie) {/ * kod * / rozwiązywanie (/ * ??? * /);} `
gogog,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.