我有一组需要从db中删除的项目。目前我的代码看起来像这样:
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),但我不知道的是如何修复它并将变量放入该局部范围。
答案 0 :(得分:1)
除了您自己想出的答案之外,您还可以使用绑定方法:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind
这是一个相当常见的错误,可以很容易地解决并在SO上多次出现。也简单干净:
result.data.forEach(function(item) {
actions.push(function() {
console.log("Delete old item", this.id);
return delAnItem(this.id);
}.bind(item));
});
答案 1 :(得分:0)
从作者的帖子中复制:
经过一些反馈,这实际上运行良好。范围很好。这是一个完整的,可运行的测试:
var getSomeItems = function() {
var deferred = Q.defer();
deferred.resolve({
count: 3,
data: [
{id: 1},
{id: 2},
{id: 3},
]
});
return deferred.promise;
}
getSomeItems()
.then(function(result) {
var actions = [];
if (result.count) {
result.data.forEach(function(item) {
actions.push(
(function() {
console.log("Delete old item", item.id);
})(item)
);
});
}
return actions.reduce(function(last, f) {
return last.then(f);
}, Q());
});
这意味着我的问题来自更上游。该死。