使用'then'方法在解析promise中强制执行顺序行为

时间:2015-12-18 17:40:09

标签: javascript parse-platform promise

我正在尝试使用promises来指示我的函数的顺序调用,但它只是没有用完。

var step2 = function(results){
   var promise = [];
   _.each(results, function(n){
       query.equalTo("thing", n);
       query.find({
            success: function(moreStuff){
               moreStuff.set("update", "matters");
               promise.push(moreStuff);
            }
       })
    })
    return Parse.Object.saveAll(promise);
    //I've also tried:
    //Parse.Object.saveAll(promise); (no return)
}

var step3 = function(){
   //the function I want to begin only after step 2 ends
}

var step1 = function(){
     query.find().then(function(results){
        return Parse.Promise.when(step2(results)) 
   }).then(function(){
         //only after step2 finishes should step3 begin
         step3();
   })
}

现在step3在step2结束之前开始。

以下是我尝试过的第一步的一些迭代:

var step1A = function(){
         query.find().then(function(results){
            step2(results)
            return Parse.Promise.when(step2)
            //I also tried this without the return 
       }).then(function(){
             //should only after step2 finishes but doesn't
             step3();
       })
    }


var step1B = function(){
         query.find({
            success: function(results){
               step2(results)
               Parse.Promise.when(step2);
               //I also tried:
               //return Parse.Promise.when(step2);
            }
          }).then(function(){
             //should only after step2 finishes but doesn't
               step3();
       })   
    }



var step1C = function(){
         query.find({
            success: function(results){
               step2(results)
               //I also tried:
               //return Parse.Promise.when(step2);

               Parse.Promise.when(step2).then(function(){
             //should only after step2 finishes but doesn't
               step3();            
               })   
            }
        })
    }

1 个答案:

答案 0 :(得分:1)

这里最大的问题是因为query.find()是异步的,所以当这一行执行时,你的promises变量只是一个空数组:

return Parse.Object.saveAll(promise);

如果你传递一个空数组,那么就没有什么可以保存的,因此在调用step3之前无需等待。

我并不熟悉Parse.com,但我相信以下内容应该有效:

var step2 = function(results){
    var promises = 
        _.map(results, function(n){
            query.equalTo("thing", n);
            return query.find().then(function (moreStuff) {
                moreStuff.set("update", "matters");
                return moreStuff;
            });
        });

    return Parse.Promise.when(promises).then(function () {
        return Parse.Object.saveAll(Array.prototype.slice.call(arguments));
    });
};

var step3 = function(){
    //the function I want to begin only after step 2 ends
};

var step1 = function(){
    query.find().then(step2).then(step3);
};