使用promises保存数据

时间:2015-06-22 05:03:09

标签: 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);
    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

在上述之后但我什么都没看到。

2 个答案:

答案 0 :(得分:0)

  1. 您不需要将null作为第一个参数
  2. 传递
  3. 您不需要同时使用save选项(第二个参数),save使用promises链(.then)
  4. 因此,只需删除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;
}