在Parse.com上我有以下功能,我的问题如下:
function myFunction(array, value) {
var logMessage;
logMessage = "array: " + array.length.toString();
console.log(logMessage);
if (!array.length) return;
if (!value) value = Math.min(10, array.length);
if (array[array.length - 1].get("advertisePointNumber") >= value) return;
var classPromise;
array[array.length - 1].set("advertisePointNumber", value);
logMessage = "(BIS)array: " + array.length.toString();
console.log(logMessage);
classPromise = (array[array.length - 1].save(null, {}).then(function (object) {
logMessage = "HERE I AM!!!";
console.log(logMessage);
if (array.length == 1) return;
array.splice(array.length - 1, 1);
return myFunction(array, value);
}, function (error) {
// saving the object failed.
console.log("error:" + error);
}));
logMessage = "(TER)array: " + array.length.toString();
console.log(logMessage);
return Parse.Promise.when(classPromise);
}
问题是我错过了什么?我从来没有看到过这样的信息" HERE I AM !!!" (并且没有错误)在日志中,因此我希望的递归调用不起作用。
我在过去读取数据时已成功使用过类似的代码。我在这里保存数据。我必须以错误的方式做事。它是什么?
更新问题:
使用以下代码行调用此函数:
myFunction(myArray, 0);
我得到以下日志:
I2015-06-22T07:05:34.160Z]myArray: 2 // Number of elements in the initial Array.
I2015-06-22T07:05:34.161Z]array: 2
I2015-06-22T07:05:34.162Z](BIS)array: 2
I2015-06-22T07:05:34.163Z](TER)array: 2
我希望看到:
I2015-06-22T07:0.....]array: 1
在上述之后但我什么都没看到。
答案 0 :(得分:0)
null
作为第一个参数save
选项(第二个参数),save
使用promises链(.then)因此,只需删除save
函数的第一个和第二个参数,如下所示
array[array.length - 1].save().then(...
更新的答案
您应该在promises链中使用多个save
调用,而不是像下面这样的递归调用
function myFunction(array, value) {
var logMessage;
logMessage = "array: " + array.length.toString();
console.log(logMessage);
if (!array.length) return;
if (!value) value = Math.min(10, array.length);
var savePromises = Parse.Promise.as();
array.map(function(element, index) {
// Calculate value based on your needs
if(element.get("advertisePointNumber") < value) {
element.set("advertisePointNumber", value);
}
savePromises = savePromises.then(function() {
return element.save();
});
});
return savePromises.then(function (object) {
logMessage = "HERE I AM!!!";
console.log(logMessage);
}, function (error) {
// saving the object failed.
console.log("error:" + error);
});
}
或者,如果您可以选择将云代码保存在一个请求中,那么您应该这样做,以减少网络请求
答案 1 :(得分:0)
您可以尝试以下方法,而不是进行递归:
classPromise = array.map(function(obj){ return obj.save();});
在es6中,同样的事情可能是:
classPromise = array.map(obj => obj.save());
修改强>
您可以将整个功能缩减为:
function myFunction(array, value) {
if ( !array || !array.length) return;
console.log("array: " + array.length);
if (!value) value = Math.min(10, array.length);
var pSave=[], i = array.length, v2=(value)? value : Math.min(10, i);
while(i>0 && array[i-1].get("advertisePointNumber") >= value){
array[i - 1].set("advertisePointNumber", value);
pSave.push(array[i - 1].save());
console.log("(BIS)array: " + i);
i--;
v2=(value)? value : Math.min(10, i);
}
return Parse.Promise.when(pSave);
}
如果您希望按顺序保存,
...
var pSave = Parse.Promise.as(1),
...
pSave.then(function(){
return array[i-1].save();
});
...
return pSave;
}