我有一组项目需要从数据库中删除。目前我的代码如下所示:
getSomeItems.get()
.then(function(result) {
var actions = [];
if (result.count) {
result.data.forEach(function(item) {
actions.push(function() {
console.log("Delete old item", item.id);
return delAnItem(item.id);
});
});
}
return actions.reduce(function(last, f) {
return last.then(f);
}, Q());
});
给定以下数据:
{
count: 3,
data: [
{ id: 1 },
{ id: 2 },
{ id: 3 }
]
}
我想要输出:
Delete old item 1
Delete old item 2
Delete old item 3
我得到了输出(正如您可能已经猜到的那样):
Delete old item 3
Delete old item 3
Delete old item 3
我知道这是因为我的项目在更高的范围(forEach)中,但我不知道如何修复它并将变量放入该局部范围。
最佳答案
除了你自己想出来的答案你还可以使用bind方法:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
这是一个相当常见的错误,可以很容易地解决并且出现了很多次。也简单干净:
result.data.forEach(function(item) {
actions.push(function() {
console.log("Delete old item", this.id);
return delAnItem(this.id);
}.bind(item));
});
关于javascript - 使用 reduce 串行链接 Javascript promise 时的范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33607441/