为承诺保存变化的变量
Save changing variables for promises
我正在使用 promises 访问我的数据库(elasticsearchjs,它使用 Bluebird)。
对于我列表中的每个 ID,我正在开始一个新查询。现在想知道查询失败时元素的ID。
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!');
});
如何在 Promise 中保存更多信息?我尝试使用 Promise.bind()
但无法正常工作。
编辑:
澄清 'size' 变量:这是一个片段,我想要前 n 个元素的结果。所以大小等于或小于我的数组大小。
一个解决方案是这样的:
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
)但问题是你没有创建(因此不要'拥有)承诺对象。如果查询库依赖于特定上下文怎么办?
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);
}
});
};
我正在使用 promises 访问我的数据库(elasticsearchjs,它使用 Bluebird)。
对于我列表中的每个 ID,我正在开始一个新查询。现在想知道查询失败时元素的ID。
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!');
});
如何在 Promise 中保存更多信息?我尝试使用 Promise.bind()
但无法正常工作。
编辑:
澄清 'size' 变量:这是一个片段,我想要前 n 个元素的结果。所以大小等于或小于我的数组大小。
一个解决方案是这样的:
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
)但问题是你没有创建(因此不要'拥有)承诺对象。如果查询库依赖于特定上下文怎么办?
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);
}
});
};