链接Javascript承诺的范围问题连续减少

时间:2015-11-09 10:46:49

标签: javascript promise q

我有一组需要从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),但我不知道的是如何修复它并将变量放入该局部范围。

2 个答案:

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

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