2016-05-18 58 views
1

我正在使用一個節點庫,它允許進行簡單的http請求並返回一個承諾 - 這很好地工作,因爲它允許多個並行進行,而且我然後用Promise.all()收集它們。但是,http請求只是返回一個字符串,我需要知道關於每個請求的一些額外的標識信息。所以我通過一種方法來做到這一點,即將請求承諾中的某些內容鏈接起來,並將這些信息添加進來。這是我迄今爲止所獲得的代碼,顯示將一個此類請求添加到稍後將收集的承諾數組中:向承諾的結果添加額外的數據

var promises = []; 
promises.push(new Promise(function(resolve, reject){ 
    ReqPromise('http://some.domain.com/getresult.php') 
    .then(function(reqResult) { 
     resolve({ 
      source: 'identifier', 
      value: reqResult 
     }); 
    }); 
})); 

而這就是我回來的這個承諾,當它決定:

{ 
    source: 'identifier' 
    value: 1.2.3.4 
} 

這是理想的方式來「標記」的承諾,結果呢?還是有什麼承諾我誤解了,這意味着我不需要像上面那樣創造額外的承諾?請注意,ReqPromise位於外部庫中,因此很難使其獲取額外的參數並將其返回。

+0

OK,請忽略的問題1 - 我還以爲是打印結果_inside_它處理解決承諾的循環,但事實證明我不是,所以這是整個陣列 - 我發現,一旦我將多於一件事情推入'promises'。我的錯。問題2仍然存在 - 這是達到預期結果的最佳方式嗎? – dsl101

+2

避免['Promise' constructor antipattern](http://stackoverflow.com/q/23803743/1048572)! – Bergi

+0

請[編輯]您的問題,以顯示您如何檢查您的結果,或刪除帖子中的第一個問題。 – Bergi

回答

2

感謝@Bergi的鏈接。這是我已經結束的代碼,我認爲它更清潔。我曾嘗試過這樣的事情,但一定是犯了一些錯誤,因爲它未返回undefined到Promise.all()。但現在沒有額外的承諾就很好地工作。

promises.push(ReqPromise('http://some.domain.com/getresult.php').then(function(reqResult) { 
    return { 
     source: 'identifier', 
     value: reqResult 
    }; 
})); 
0

@ DSL101,往前一步不是你自己的答案,它可以是有用的.map()數據的陣列,以承諾的數組,然後將每個數據項與它對應的異步衍生的結果聯繫起來。

例如,您可能會從一些網址開始。

var data = ['http://path/0', 'http://path/1', 'http://path/2', ...]; 
var promises = data.map(function(url) { 
    return ReqPromise(url).then(function(reqResult) { 
     return { 
      'source': url, 
      'value': reqResult 
     }; 
    }); 
}); 
Promise.all(promises).then(function(results) { 
    // each result has a .value and a corresponding .source (url) property 
}); 
+0

不錯。事實上,就我而言,承諾並不是同質的,但這是一個很好的解決方案。 – dsl101

+0

一個留在你的後口袋裏。 –