保存更改承诺的变量

时间:2015-05-18 19:30:49

标签: javascript node.js promise bluebird

我正在使用promises进行数据库访问(elasticsearchjs,它使用Bluebird)。

对于我的列表中的每个ID,我正在开始一个新的查询。现在我想知道查询失败时元素的ID。

nested

如何在我的承诺中保存其他信息?我尝试使用var idList = ['id1', 'id2', 'id3', '...']; var promises = []; for (var i = 0; i < size; i++) { // dbQueryFunction returns a promise object promises.push(dbQueryFunction(idList[i]) .then(function(data) { // Do stuff... }) .error(function(errorMessage) { console.log('[ERROR] id: ' + id); //<== Print ID here }) ); } // Wait for all promises to be resolved Promise.all(promises) .then(function() { console.log('Everything is done!'); }); 但无法正常使用。

编辑:

澄清&#39;尺寸&#39;变量:这是一个片段,我想要前n个元素的结果。因此大小等于或小于我的数组大小。

2 个答案:

答案 0 :(得分:4)

解决方案是:

var promises = idList.map(function(id){
    return dbQueryFunction(id)
    .then(function(data) {
        // Do stuff...
    })
    .error(function(errorMessage) {
      console.log('[ERROR] id: ' + id); 
    });
});

(如果size变量不符合数组的大小,请使用idList.slice(0,size)代替idList。)

关于bind的注意事项:它可以在这里使用(添加.bind(idList[i])然后记录this)但问题是你没有创建(因此没有拥有)承诺对象。如果查询库依赖于特定的上下文会怎样?

答案 1 :(得分:0)

var idList = ['id1', 'id2', 'id3', '...'];
var promises = [];

 // Could you do this?
   promises.push(dbQueryFunction(idList[i])
     .then(function(data) {
       // Do stuff...
       idList.deleteID(idList[(promises.length - 1) || 0]);
       // Or something to remove the successful ids from the list
       // leaving you with the idList of the unsuccessful ids
     })
     .error(function(errorMessage) {
        console.log('[ERROR] id: ' + idList[0]); //<== Print ID here
     })
  );

Array.prototype.deleteID = function(array,id){
   array.forEach(function(el,indx,arr){
      if(el == id){
         arr.splice(indx,1);
      }
   });
};