javascript - Javascript for 循环解析 Promise

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

最佳答案

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

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

这样的排序如下所示:

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

关于javascript - Javascript for 循环解析 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28861276/

相关文章:

javascript - 如何从异步调用返回响应?

JavaScript promise

javascript - 删除禁用属性,jquery 在 Chrome 中不起作用

javascript - 如何将选项从 HTML 推送到 JS 中的对象数组?

javascript - Chrome 无法通过 javascript 重定向 URL

angular - 如何正确使用 Observable 和 Angular 异步管道?

javascript - React JS 在状态中存储 id 数组

java - 来自 servlet 的 Java 异步处理

ios - Swift:试图在一页中只显示用户数据

java - HTTP Post 有效但 GET 无效