Javascript 使用承诺保存数据
在Parse.com上,我有以下功能,我的问题如下:Javascript 使用承诺保存数据,javascript,parse-platform,promise,Javascript,Parse Platform,Promise,在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);
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);
}
问题是我错过了什么?我从未在日志中看到消息“我在这里!!!”(而且也没有错误),因此我希望的递归调用不起作用
我曾经在读取数据时成功地使用过类似的代码。我在这里保存数据。我一定是做错事了。这是什么
问题的最新情况:
使用以下代码行调用此函数:
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
但我什么也没看到
null
作为第一个参数传递保存
与选项(第二个参数)一起使用,也不需要将保存
与承诺链(.then)一起使用save
函数的第一个和第二个参数,如下所示
array[array.length - 1].save().then(...
最新答案
您应该在承诺链中使用多个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);
});
}
函数myFunction(数组,值){
var日志消息;
logMessage=“数组:”+array.length.toString();
console.log(logMessage);
如果(!array.length)返回;
如果(!value)value=Math.min(10,array.length);
var savepromissions=Parse.Promise.as();
map(函数(元素、索引){
//根据您的需求计算价值
if(element.get(“advertisePointNumber”)
或者,如果您可以选择使用云代码将它们保存在一个请求中,您应该这样做,以减少网络请求,而不是使用递归,您可以尝试以下方法:
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;
}
你能发布你得到的日志吗,比如
array:。。。;(之二)啊…
我刚刚编辑了这个问题,以提供您所需要的。我希望它能有所帮助。当您尝试array[array.length-1].save()时会发生什么情况。然后(fu…
您的意思是删除:null,{}?我把它注释掉了,它没有改变。@Michel看到下面的答案,我这样做了,但它仍然没有更好的效果。准确地说,第一次保存是正确的,但是由于没有递归调用,以下元素没有被保存。我对承诺做了什么错误吗?这个递归的目的和意图是什么ion?这是为了保证保存过程的顺序;如果我对承诺的理解是正确的。如果你知道为什么它不起作用,请告诉我。这是一个云函数。谢谢。行“var savePromises=Parse.Promise.as(1);”在某种程度上初始化了承诺链?这是正确的吗?承诺确实很强大,但不是那么容易:)谢谢它工作正常,保存了整个阵列。我仍然很好奇为什么我的代码不起作用。我以前从未使用过map,我需要检查它是否保证保存过程中的任何顺序。如果我对承诺的理解是正确的,我所做的将保证订单。@Michel您可以使用选项2来确保顺序感谢这段代码,它对帮助我更好地理解承诺非常有用。1的含义是什么?在第:var pSave=Parse.Promise.as(1)行中,它是数组的最大索引吗?我不确定我是否完全理解您在“如果您希望按顺序保存它,”