2016-12-13 262 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}; 
    }); 
}