Bir promise işlevine parametre nasıl aktarılır


122

bu aptalca bir soru gibi görünebilir ama ben bu konuda acemiyim. Js düğümündeki vaatler üzerinde çalışıyorum. Ve parametreyi bir vaat işlevine geçirmek istiyorum. Ancak ben anlayamadım.

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

ve işlev şöyle bir şeydir:

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
Bunu yapmak için bir neden yok, sadece tanımlayabilirsiniz usernameve passworddaha yüksek bir kapsamda
adeneo

Ama başka bir modülden söz veriyorum ve ayrıca kullanıcı adı ve şifre statik değil, istemci tarafından geliyor. Bir fonksiyonun belirlediği ve diğerinin kullandığı bir tür küresel değişken tanımlamak güvenli midir? Değişkenin başka bir müşteri tarafından değiştirilme riski var mı?
kundante

1
@kundante Globale ihtiyacınız yok. Kapanışlar hakkında bilgi edinin.
SLaks

@adeneo söz eşzamansızdır - ya ilk söz çözülmeden önce işlevi ikinci kez çağırırsa?
Mawg, Monica

Yanıtlar:


234

Sözünüzü bir işlevin içine koyun, yoksa işini hemen yapmaya başlayacaktır. Artı, parametreleri işleve aktarabilirsiniz:

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

Sonra onu kullanın:

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

kullanın:

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

nedir someModule?
Si8

3
Bu sadece
OP'den

3
@Shanoor Nedir uid? "Şeyler çalıştı!" Dizesi mi?
Old Geezer

2
@ OldGeezer, sözün getirisini tutmak için sadece bir değişken. Bu durumda, evet, bu "İşler çalıştı!"
Shanoor

yeni vaatte ebeveyn sınıfından bir işlevi nasıl çağıracağınızı biliyor musunuz?
TimeParadox

7

Başka bir yol ( Denemelisiniz ):

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
Örneğiniz, birden çok argümanın gösterilmesi için yapısızlaştırdığınız bir dizi veya nesne ile çözerseniz daha iyi olur ve ayrıntılı söz zaten şu şekilde çözülmüş olarak oluşturulur: Promise.resolve ([arg1, arg2, arg3]);
user5389726598465

1
Bence bu yanlıştır çünkü iletilen ikinci parametre then, reddetme işlevinin dönüş değerini işlemek için bir geri arama . Yerine resolve('Success!');denemede reject('Error');Biz hatası alırsınız: Unhandled promise rejectionBurada çıkış gördükleri için var extraData = 'ImExtraData';bir olduğu küresel çünkü kullanarak geçen değişken ve NOTthen
Shakiba moshiri

Bunu geçemezseniz, sözde / o zaman geçemezseniz kapsamı olmadığı için ona erişemezsiniz.
sadiq

kaldırmayı deneyin ve çalışıp çalışmadığını görün. codepen.io/k-five/pen/ZNOvKG tarayıcınızda konsol günlüğünü görün
Shakiba Moshiri

Kod kaleminizi takdir ediyorum, ancak iki farklı değişken kullanın ve ardından gerçek faktörü görün! AYNI DEĞİŞKENLERDEN KAÇININ. Sadece global değişken iyi çalıştıysa, fazladan parametre iletmemiz gerekmiyordu.
sadık

1

Daha da kısa

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

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

0

.Bind () parametresini işleve ( bu ) iletmek için kullanabilirsiniz .

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

Bu işleve .then(), bir Düğme içinde çağırdığımda kabul etmek için nasıl düzenleyeceğime sahibim ` SaveImagesToFirebase = () => {const uid = firebase.auth (). currentUser.uid; // Sağlayıcı const {resimler} = this.state; images.map (image => {let file = image.uri; console.log (dosya); const path = "Img " + Math.floor (Math.random () * 1500); console.log ("@ IMAGE" , yol); const ref = firebase .storage () .ref ( provider/${uid}/ProviderGalary/${path}); ref.put (dosya);}); }; "@gogog
DevAS

@DevAS <button onclick = "then_function (SaveImagesToFirebase.bind (this))"> </button> komut dosyası, `var then_function = function (promise) {new Promise (promise) .then (function (e) {/ * code *) /})}; function SaveImagesToFirebase (çözümleme, reddetme) {/ * kod * / çözümleme (/ * ??? * /);} ``
gogog
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.