我正在尝试使用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();
})
}
})
}
答案 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);
};