nodejs - 将全局变量传递给parse中的promise回调

时间:2016-05-27 12:08:21

标签: javascript node.js parse-platform parse-server

考虑这段代码

for (var i = 0; i < data.length; i++){
    query.equalTo("objectId",data[i].id).first().then(
        function(object){
            object.set("username", data[i].username);
            object.save();
        }
    );
}

在此示例中,data[i]内的then callback是数组的最后一个元素

考虑通常在javascript世界中工作的第二个例子

假设我们使用一些连接到mongodb并具有名为update

的函数的API
for (var i = 0; i < data.length; i++){
    query.eq("_id",data[i].id).update(data[i].username);
}

eq返回对象,update更新该对象并保存。

如果这样的事情成为可能,那会不会很棒......(不确定它是否也会起作用)

for (var i = 0; i < data.length; i++){
    query.equalTo("objectId",data[i].id).first().then(
        function(object, data[i]){
            object.set("username", data.username);
            object.save();
        }
    );
}

2 个答案:

答案 0 :(得分:3)

这实际上只是因为范围var而无效。您可以按照需要运行示例:

a)使用let代替var

b)为i创建新范围(这是let基本上做的事情)。 (在匿名fn中,为了清楚起见,我使用ii代替ii也可以使用):

for (var i = 0; i < data.length; i++){
    (function(ii) {
        query.equalTo("objectId",data[ii].id).first().then(
            function(object){
                object.set("username", data[ii].username);
                object.save();
            }
        );
    })(i)
}

答案 1 :(得分:0)

使用parse解决此问题的最佳方法是使用递归

   ... 

   var do = function(entries, i){
        if (entries[i]){

            let user = data[i];

            query.equalTo("objectId", user.id).first().then(
                function(object){
                    object.set("username", user.username);
                    object.save();
                }
            ).then(
                function(){
                    return do(entries, i + 1);
                }
            );
        }
    }