2016-10-19 100 views
-1

我遇到了如何解決並從鏈接承諾中傳回數據的問題。我正在使用節點js和request-promise。這是我的代碼解決循環中的承諾

start(name) 
    .then(firstFunction) 
    .then(secondFuntion) 
    .then(function(){ 
     // i want to return data from secondfunction back 
    )) 

問題是在secondFunction我有一個for循環,進行各目標i從所以firstFunction,這是對象的數組得到的呼叫。我是否在每次迭代之後或者在所有迭代之後解決承諾。創建一個全局對象並保存結果並返回結果會更聰明嗎?我對secondFunction代碼看起來像這樣

var secondFunction = function(data){ 
    var promise = new Promise(function(){ 
     for(var i= 0; i <data.length; i ++){ 
      options = { url: "", jason: true} 
      rp.(options) 
       .then(function(resp){ 
       // i do something with respose and need to save this 
       //should i resolve the promise here?? 
       }) 
       .catch(function(err){ 
       }); 
     } 
    }); 
    return promise; 
} 

編輯

我理解了它!感謝所有幫助,我的第二個功能,我這樣做

var task = function(item){ 
    // performed the task in here 
} 

var actions = data.map(task); 
return Promise.all(actions); 

回答

0

在一個陣列上執行的每個項目一個異步操作的正常模式,是使行動統一到一個返回無極的功能,你再使用[].map()將值數組映射到Promise數組中。然後使用Promise.all(),它接收一個Promises數組,並返回一個單獨的Promise,該Promise使用一個數組值來解析,此時原始數組中的所有Promise均已解析。它看起來像這樣:

var secondFunction = function(data) { 
    var promisesArray = data.map(rp); 
    return Promise.all(promisesArray); 
} 

你的第三個.then()將有來自data上每個項目的申請rp,在他們出現在data順序解析值的數組。

一個較短的版本與一些ES6糖是:

const secondFunction = data => Promise.all(data.map(rp)); 

如果你使用的藍鳥,這是服務器端JS事實上的承諾庫,你可以使用簡寫,Promise.map(),其中接受一個數組和映射函數,並做同樣的事情:

const secondFunction = data => Promise.map(data, rp); 
+0

非常感謝!我用你的建議 – inhaler