【问题标题】:Java script for loop Parse PromiseJavascript for循环解析承诺
【发布时间】:2015-05-05 20:15:15
【问题描述】:

我正在尝试读取 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();
        });

【问题讨论】:

  • 这种嵌套事件的疯狂是我创建 www.taskrunnerjs.com 的原因——尽管还有很多其他选择。 IMO 那些风格的链接比这更容易阅读和理解。 (这只是一个意见,而不是一个答案。老实说,这并不完全清楚你在问什么。)
  • 这些后续步骤是否相互依赖,换句话说,例如addPatient 必须在 addProvider 工作之前完成,还是可以按任何顺序执行?
  • @danh... 是的... addPatient 依赖于 addProvider 的完成
  • @brianvaughn ... www.taskrunnerjs.com 看起来很棒...但我认为我不能在 parse.com 上使用它。我可以使用承诺吗?
  • 您可以(并且应该)在客户端和服务器上使用 parse.com 的 Promise。 @brianvaughn 的图书馆看起来经过深思熟虑,尽管我从未使用过它。

标签: javascript asynchronous parse-platform


【解决方案1】:

正确的正确答案取决于这些操作的语义,它们是否以任何方式相互依赖。正确答案的另一部分说明了 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;
    });
}

【讨论】:

  • 这与我所寻找的很接近。我不知道,我们可以添加那些“then”块......不过,我们如何从块中返回一个值。 addPatient 完成后,我需要当前添加的患者的 objectId。
  • 另外,我们不能执行 addpatient,然后 addProvider,然后 addLocation 为同一条记录,然后移动到下一条记录吗?
  • @i_raqz - 第一条评论:见编辑。 then() 的 var args 将包含对应于每个已履行承诺的对象。重新评论您的第二条评论:是的,这很容易通过为每条记录制作一系列承诺来完成,而不是为每种功能类型制作一个组。
  • @i_raqz - 重新分组以说明按输入而不是按功能分组的观点。更重要的一点是链接 then()'s 给你序列和执行 when()'s 给你半并发。
  • 这正是我想要的。你给了我一个关于使用 Promise 和异步调用的小教程。
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 2016-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
相关资源
最近更新 更多