Javascript for循环Parse Promise

时间:2015-03-04 17:45:00

标签: javascript asynchronous parse-platform

我正在尝试在parse.com上读取一个文件,并使用for循环遍历其中的所有记录。在每条记录上,我需要执行4次操作,每次操作都依赖于另一次。有人可以指导我如何做到这一点,以便在for循环中处理每条记录。

Parse.Cloud.httpRequest({
            url: urlValue
        }).then(function(fileResponse) {
            console.log("processUploadFile:httpRequest:response:" + JSON.stringify(fileResponse.buffer.length));
            // console.log("processUploadFile:Text:" + fileResponse.text);

            var records = fileResponse.text.split("\r");

            for (var i = 0; i < records.length; ++i) {
                // console.log("Record:" + i + " detail:" + records[i] + "\n\n");
                var record = records[i];


                        console.log("processUploadFile:adding patient");
                        Parse.Cloud.run("addPatient", {
                            record:record
                        }, {
                            success: function(objectId) {
                                console.log("Created objectId:" + JSON.stringify(objectId));
                                Parse.Cloud.run("addProvider", {
                                    record:record
                                }, {
                                    success: function(objectId) {
                                        console.log("Created objectId:" + JSON.stringify(objectId));

                                        Parse.Cloud.run("addLocation", {
                                            record:record
                                        }, {
                                            success: function(objectId) {
                                                console.log("objectId:" + JSON.stringify(objectId));
                                            },
                                            error: function(error) {
                                                console.log(JSON.stringify(error));
                                            }
                                        });
                                    },
                                    error: function(error) {
                                        console.log(JSON.stringify(error));
                                    }
                                });
                            },
                            error: function(error) {
                                console.log(JSON.stringify(error));
                            }
                        });
                    };
                }
            }


            response.success();
        });

1 个答案:

答案 0 :(得分:1)

正确的答案取决于这些操作的语义,它们是否以任何方式相互依赖。右边答案的另一部分说明了parse.com规定的交易率限制和超时。这还取决于云操作中发生的情况以及正在处理的数据量。

但是正确的答案(与右边相反)是通过链接promises的then()来串行执行操作,并使用Parse.Promise.when()同时(或以任意顺序)执行操作组。 / p>

一个这样的排序看起来像这样:

var patientQs = [];
var providerQs = [];
var locationQs = [];
var records;

Parse.Cloud.httpRequest({url: urlValue}).then(function(fileResponse) {
    console.log("processUploadFile:httpRequest:response:" + JSON.stringify(fileResponse.buffer.length));
    records = fileResponse.text.split("\r");
    for (var i = 0; i < records.length; ++i) {
        // console.log("Record:" + i + " detail:" + records[i] + "\n\n");
        var record = records[i];
        patientQs.push(Parse.Cloud.run("addPatient", {record:record}));
        providerQs.push(Parse.Cloud.run("addProvider", {record:record}));
        locationQs.push(Parse.Cloud.run("addLocation", {record:record}));
    }
    return Parse.Promise.when(patientQs);
}).then(function() {
    // since the result of addPatient is an objectId, arguments
    // will be the corresponding objectIds for each run 
    for (var i=0; i<arguments.length; i++) {
        console.log(arguments[i] + " is the object id for input record " + JSON.stringify(records[i]));
    }
    return Parse.Promise.when(providerQs);
}).then(function() {
    return Parse.Promise.when(locationQs);
}).then(function() {
    response.success();
}, function(error) {
    response.error(error);
});

这说,“通过http检索的记录,首先为这些记录添加所有患者,然后添加所有提供者,依此类推”。

或者,您可以按输入记录对操作进行分组,如下所示:

Parse.Cloud.httpRequest({url: urlValue}).then(function(fileResponse) {
    console.log("processUploadFile:httpRequest:response:" + JSON.stringify(fileResponse.buffer.length));
    var records = fileResponse.text.split("\r");
    var recordQs = [];

    for (var i = 0; i < records.length; ++i) {
        // console.log("Record:" + i + " detail:" + records[i] + "\n\n");
        var record = records[i];
        recordQs.push(processARecord(record));
    }
    return Parse.Promise.when(recordQs);
}).then(function() {
    response.success(arguments);
}, function(error) {
    response.error(error);
});

function processARecord(record) {
    var result = {};
    return Parse.Cloud.run("addPatient", {record:record}).then(function(objectId) {
        console.log(objectId + " is the object id for input record " + JSON.stringify(record));
        result.patientId = objectId;
        return Parse.Cloud.run("addProvider", {record:record});
    }).then(function (providerId) {
        result.providerId = providerId;
        return Parse.Cloud.run("addLocation", {record:record});
    }).then(function(locationId) {
        result.locationId = locationId;
        return result;
    });
}