2016-03-23 18 views
0

Aşağıdaki kod örneğini, bir dizi sonuç üzerinde döngü yapan ve her biri için bir http isteği yapan bir komut dosyasına uygulamıştım.Dizi işlendiğinde bir söz dizisinden nasıl çıkabilirim?

Dizideki tüm öğeler işlendikten sonra komut dosyası çıkmıyor. Buna nasıl uyum sağlarım?

Benim uygulama bir API çağrısı yapar ve bir söz verir:

… 
}).then(function(results) { 
    return sequence(results, function(result) { 
// ^^^^^^ 
     return checkSpam(result).then(function(akismet) { 
//  ^^^^^^ 
      if (akismet) { 
       return write_spam_to_file(result); 
//    ^^^^^^ // assuming the write is asynchronous and returns a promise? 
      } 
     }); 
    }); 
}) … 

Eğer don':

ilk pasajı aksine
.... 

}).then(function(results){ 
sequence(results, function(result){ 

    checkSpam(result).then(function(akismet){ 
     if(akismet) { 
      //console.log('spam returned from checkspam'); 
      write_spam_to_file(result); 
     } else { 

      //console.log('no spam returned from checkspam'); 
     } 
    }) 
}); 

}).catch(function (e) { 
    console.log('Error occurred:'); 
    console.log(e); 
}); 


function sequence(array, callback) { 
    return array.reduce(function chain(promise, item) { 
     return promise.then(function() { 
      return callback(item); 
     }); 
    }, Promise.resolve()); 
} 

function checkSpam(entry) { 

    var akismetPromise = new Promise(function resolver(resolve, reject) { 
     akismet.checkSpam({ 
      user_agent: 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1', 
      referrer: 'http://google.com', 
      user_ip: entry.ip, 
      comment_author: entry.poster, 
      comment_content: entry.message, 
      comment_type: 'forum-post' 


     }, function (err, spam) { 
      if (err) reject(err); 
      resolve(spam); 
     }); 

    }); 
    return akismetPromise; 

} 
+0

"Çıkmıyor" ile tam olarak ne demek istiyorsunuz? Düğüm kaçmayacak mı demek istiyorsun? Bunun yerine, akismet ya da ne kullanıyor olursanız olun, vaatlerden kaynaklanmıyor. – Bergi

+0

@Bergi Sözler için yeniyim, yanlış bir şey yapıp yapmadığımdan emin değildim. Herhangi bir ışığı tutması durumunda biraz daha fazla kod ekledim. Bir göz attığın için teşekkürler. – codecowboy

+0

Diziler arasında döngü yaparken, yinelemeyi durdurmak için döngü yönteminin içinden yanlış döndürebilirsiniz. – Silkster

cevap

3

, gerçek kodunuz return anahtar kelime demet yoksun t always return a promise, eşzamansız işlevlerden (then geri aramalar dahil), söz zincirinin ne beklemesi gerektiğini bilmez ve herhangi bir sonuç beklemeden bir sonraki geri bildirimi yürütür.

+1

unutulmuş iadeler üzerine bir kanonik ihtiyacımız var bu sorular bir kez geri dönüyor. "Eylem için beklemeyin söz" ya da böyle bir şey, bu biraz genel sesler geliyor ... –

+0

@BenjaminGruenbaum: Evet, ama yazacağım bir sonraki kanonik asenkron döngüleri hakkındadır :-) Zaten iyi bir tane var mı?) – Bergi

İlgili konular