Javascript 使用承诺保存数据

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);

在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);
}
问题是我错过了什么?我从未在日志中看到消息“我在这里!!!”(而且也没有错误),因此我希望的递归调用不起作用

我曾经在读取数据时成功地使用过类似的代码。我在这里保存数据。我一定是做错事了。这是什么

问题的最新情况:

使用以下代码行调用此函数:

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)行中,它是数组的最大索引吗?我不确定我是否完全理解您在“如果您希望按顺序保存它,”