2016-12-13 66 views
1

我想了解Promise.all的這種行爲。javascript - 我做錯了什麼?

var checkIfModuleExists = promisify(
    function (m, cb){ 
     var doc = { 
     index: 'app1', 
     type: 'm1', 
     id: m.id, 
     body: { } 
     }; 
     client.exists(doc , 
     function (err, exists) { 
      cb(err, exists); 
     }); 
    }); 

,然後我有一個promise.all這樣的:

var module = [{id: 'aa'}, {id: 'bb'}]; 
Promise.all(modules.map(function(module){ 
     return checkIfModuleExists(module); 
    })).then(function(data){ 
     console.log(data); 
    }).catch(function(err){ 
     console.log(err); 
    }); 

當我運行這個「然後」秀[假的,真]:這似乎是正常的,但我不明白的是,如果我改變我的回調函數,像這樣cb({exists: exists, m: m}, err);,我只收到json,沒有更多的數組。我想接收包含m的數組,如果模塊存在與否(如下所示:[{m:true/false},{m:true/false}]))。你能解釋這種行爲,以及如何獲得包含每個模塊的數組的狀態?謝謝

+6

回調的簽名是'(錯誤,successValue)',所以你應該叫'CB(ERR,{M:存在}' - 你有參數錯誤的方式圍繞 – CodingIntrigue

+1

每CodingIntrigue的評論,這似乎與'Promise.all()'完全沒有任何關係,所以你的問題標題有點偏離標準。如果你調用了'checkIfModuleExists()。then()'all by本身。 – jfriend00

+0

請在你的標題中描述你的實際問題。就目前而言,你的標題將適用於這裏發佈的一半問題。 –

回答

2

正如在評論中提到的,你混淆了錯誤和結果參數。會發生什麼是第一個承諾將被拒絕,導致您的錯誤處理程序與您期望的對象一起執行。

不過,這不是你應該如何使用promisify反正。寧做

var clientExists = promisify(client.exists, {context:client}); 
function checkIfModuleExists(m) { 
    return clientExists({ 
     index: 'app1', 
     type: 'm1', 
     id: m.id, 
     body: { } 
    }).then(function(exists) { 
     return {exists: exists, m: m}; 
    }); 
}