使用 promises 在嵌套循环中保存
Saving within nested loops with promises
我想将一个名为 singleInfo 的对象保存在一个列中以用于限定 parseObjects,如下所示。下面的代码选择要保存到的正确对象,但它只将用于最后一个对象的数据保存到所有对象。我很确定这是我如何进行循环的问题。我认为承诺会解决这个问题。我过去使用过类似的承诺模式,提供了很好的结果,但这次没有用。我认为这与嵌套循环有关,因为之前我只在单个循环中使用过这种模式。
var func = function(){
var promise = Parse.Promise.as();
var array = [];
var pairs = [parseObject, parseObject, parseObject];
var a = pairs.length;
while(a--){
var pair = pairs[a];
var singles = [obj, obj, obj, obj, obj];
var b = singles.length;
while(b--){
var single = singles[b];
if(single.value === pair.get('value')){
var singleInfo = {news: single.news, time: pair.get('time')}
query.get(pair.id, {
success: function (goal){
goal.set('newColumn', singleInfo);
array.push(goal.save());
}
});
}
}
promise.then(function(){
return Parse.Promise.when(array);
}
编辑:
我没有完全理解你的代码(缺少括号),但我认为问题出在这一行 return Parse.Promise.when(array);
,因为 array
在成功回调时得到更新,所以 Promise.when
可能操作不正确的数组,
我已经从 while 循环中取出那条线(for a
),promisified query.get
,还没有测试它,希望它能工作和你所期待的...
var func = function(){
var array = [];
var pairs = [parseObject, parseObject, parseObject];
var a = pairs.length;
while(a--){
var pair = pairs[a];
var singles = [obj, obj, obj, obj, obj];
var b = singles.length;
while(b--){
var single = singles[b];
if(single.value === pair.get('value')){
var singleInfo = {news: single.news, time: pair.get('time')};
array.push(pGet(pair.id, singleInfo));
}
}
}
return Parse.Promise.when(array).then(function(){
var promises = [];
for(var i=0;i<arguments.length;i++){
promises.push(arguments[i]);
}
return Parse.Promise.when(promises);
});
}
function pGet(id, info){
var promise = new Parse.Promise();
query.get(id, {
success: function (goal){
goal.set('newColumn', info);
promise.resolve(goal.save());
}
});
}
旧答案
解决它的最简单方法是,用匿名函数包装它....
...
var singleInfo = {news: single.news, time: pair.get('time')}
(function(id, info){
query.get(id, {
success: function (goal){
goal.set('newColumn', info);
array.push(goal.save());
}
});
})(pair.id, singleInfo);
...
我想将一个名为 singleInfo 的对象保存在一个列中以用于限定 parseObjects,如下所示。下面的代码选择要保存到的正确对象,但它只将用于最后一个对象的数据保存到所有对象。我很确定这是我如何进行循环的问题。我认为承诺会解决这个问题。我过去使用过类似的承诺模式,提供了很好的结果,但这次没有用。我认为这与嵌套循环有关,因为之前我只在单个循环中使用过这种模式。
var func = function(){
var promise = Parse.Promise.as();
var array = [];
var pairs = [parseObject, parseObject, parseObject];
var a = pairs.length;
while(a--){
var pair = pairs[a];
var singles = [obj, obj, obj, obj, obj];
var b = singles.length;
while(b--){
var single = singles[b];
if(single.value === pair.get('value')){
var singleInfo = {news: single.news, time: pair.get('time')}
query.get(pair.id, {
success: function (goal){
goal.set('newColumn', singleInfo);
array.push(goal.save());
}
});
}
}
promise.then(function(){
return Parse.Promise.when(array);
}
编辑:
我没有完全理解你的代码(缺少括号),但我认为问题出在这一行 return Parse.Promise.when(array);
,因为 array
在成功回调时得到更新,所以 Promise.when
可能操作不正确的数组,
我已经从 while 循环中取出那条线(for a
),promisified query.get
,还没有测试它,希望它能工作和你所期待的...
var func = function(){
var array = [];
var pairs = [parseObject, parseObject, parseObject];
var a = pairs.length;
while(a--){
var pair = pairs[a];
var singles = [obj, obj, obj, obj, obj];
var b = singles.length;
while(b--){
var single = singles[b];
if(single.value === pair.get('value')){
var singleInfo = {news: single.news, time: pair.get('time')};
array.push(pGet(pair.id, singleInfo));
}
}
}
return Parse.Promise.when(array).then(function(){
var promises = [];
for(var i=0;i<arguments.length;i++){
promises.push(arguments[i]);
}
return Parse.Promise.when(promises);
});
}
function pGet(id, info){
var promise = new Parse.Promise();
query.get(id, {
success: function (goal){
goal.set('newColumn', info);
promise.resolve(goal.save());
}
});
}
旧答案
解决它的最简单方法是,用匿名函数包装它....
...
var singleInfo = {news: single.news, time: pair.get('time')}
(function(id, info){
query.get(id, {
success: function (goal){
goal.set('newColumn', info);
array.push(goal.save());
}
});
})(pair.id, singleInfo);
...