使用reduce串行链接Javascript承诺时的作用域问题



我有一个项目集合,需要从数据库中删除。目前我的代码如下:

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)中,但我不知道如何修复它并将变量放入该局部范围。

除了您自己找到的答案之外,您还可以使用绑定方法:

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));
});

转载自作者的帖子:

经过一些反馈,这实际上运行良好。范围不错。这是一个完整的、可运行的测试:

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());
});

这意味着我的问题来自上游。该死。

相关内容

  • 没有找到相关文章

最新更新