Bir JavaScript sözünü bir sözden başka bir şeyi nasıl iade edebilirim?


38

Bir modülde bir yöntemin uygulanması için müşteriden bir spesifikasyon var:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

Bir dizi dizi verilirse,

['comedy', 'drama', 'action']

İşte bir söz ile bir iskelet yöntemi:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

Tarzda bulunan verileri geri getirme sözü verilebilir mi? Spesifikasyon tanımına ulaşmanın daha iyi bir yolu var mı?


8
Sözler, değerleri "geri vermez", geri çağırır (.then () ile verdiğiniz). Spec sadece bana karıştı geliyor. Muhtemelen resolve([genre1, genre2, ...]);, söz verilen uygulamanın içinde yapman gerektiğini söylemeye çalışıyor .
Ixrec,

Yanıtlar:


40

Vaatlerin nasıl kullanıldığını anlamadığınız anlaşılıyor gibi. Bir söz verirsin. Daha sonra, kodunuz vaadi çözdüğünde, bir sonucu ile çözer ve bu sonuç .then()vaadi işleyiciye iletilir :

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});

5
Bu, vaatlerin beklediğim gibi çalıştığını doğruluyor.
sealocal

Muhtemelen, buna neden ihtiyaç duyulduğunu anlamıyorsunuz. Ortamda, Realm ile Redux ile Native React gibi, Redux createStore ilk durumuna koymak zorundayım. Bölge'den alınmalı ama söz veriyor. Çok hızlı ve basit olması gerektiği için verileri döndürene kadar engellemek istiyorum. Bunun yerine, RealS vaatlerinin ve her zamanki JSON nesnesinin createStore () için nasıl bir araya geldiği konusunda sorun yaşıyorum
19

26

Güncelleme sürümü kullanılarak awaityerine .then().

awaitVaat çözülene kadar yürütmeyi durdurur (yani, bir değeri olan). Kullanmanın aksine .then()sadece awaitvaat eden çeşitli fonksiyonları çalıştırırken değerlerini koruyabilirsiniz ve uygulama bir sonraki satıra devam eder (buna 'doğrudan stil denir). Ayrıca , JavaScript'in geri kalanıyla tutarlı olduğundan, her yerden daha iyi görünmesi çok daha hoş .then().

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

Bekleyen tüm mevcut tarayıcılarda ve düğümde desteklenir


1
Oh hey vay bak, bu konuda 3 SE soru ve sonunda gerçek bir cevabımız var!
Andrew,
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.