javascript - 使用 reduce 串行链接 Javascript promise 时的范围问题

标签 javascript promise q

我有一组项目需要从数据库中删除。目前我的代码如下所示:

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/

相关文章:

javascript - 构造函数中的异步操作

javascript - 可以使用 Promise 来触发一堆异步加载吗?

angularjs - 使用 $route resolve stops 页面解决 breeze query/Q promise

javascript - 如何在关闭选项卡时强制注销用户

javascript - 无需过多嵌套即可调用多个 API

javascript - jQuery replaceWith 填充原始 HTML 而不是替换为新标签 : How do I fix this?

javascript - 从 promise 中返回 Unresolved promise

javascript - 带有专用网络 worker 的 BreezeJs

javascript - Crockford 关于构造函数调用模式的代码

javascript - ServerClickHandler 结果为 "Error encountered: Required: required"