【问题标题】:How to properly use Parse / Promise?如何正确使用 Parse / Promise?
【发布时间】:2015-06-03 13:08:54
【问题描述】:

我正在使用 Parse.com 编写一些 JavaScript 代码。

说实话,我一直在阅读如何使用 Promise 并进行了大量研究,但仍然无法弄清楚如何正确使用它..

这是一个场景:

  1. 我有两个名为 ClientInvoiceHeader 的表(对象)
  2. 客户端可以有多个InvoiceHeader
  3. InvoiceHeader 有一个名为“金额”的列,我想要每个客户的 InvoiceHeader 的总金额。

例如,如果客户 A 有两个 InvoiceHeader,金额分别为 30 和 20,而客户 B 一无所获,我希望在 tempArray 中看到的结果是 '50, 0'。

但是,使用以下代码,它看起来是随机的。我的意思是有时 tempArray 得到 '50, 50' 或 "50, 0"。我怀疑这是由于错误使用了 Promise。

请帮助我。我一直在研究代码并卡住了几天。

$(document).ready(function() {
    var client = Parse.Object.extend("Client");
    var query = new Parse.Query(client);
    var tempArray = [];

    query.find().then(function(objects) {
        return objects;
    }).then(function (objects) {
        var promises = [];
        var totalForHeader = 0;

        objects.forEach(function(object) {
            totalForHeader = 0;

            var invoiceHeader = Parse.Object.extend('InvoiceHeader');
            var queryForInvoiceHeader = new Parse.Query(invoiceHeader);
            queryForInvoiceHeader.equalTo('headerClient', object);

            var prom = queryForInvoiceHeader.find().then(function(headers) {

                headers.forEach(function(header) {
                    totalForHeader += totalForHeader +
                                      parseFloat(header.get('headerOutstandingAmount'));
                });

                tempArray.push(totalForHeader);
            });
            promises.push(prom);
        });
        return Parse.Promise.when.apply(Parse.Promise, promises);

    }).then(function () {
        // after all of above jobs are done, do something here...
    });
} );

【问题讨论】:

    标签: javascript jquery parse-platform promise


    【解决方案1】:

    假设 Parse.com 的 Promise 类遵循 A+ 规范,并且我知道你想在哪里结束哪些位,这应该可以工作:

    $(document).ready(function() {
    
        var clientClass = Parse.Object.extend("Client");
        var clientQuery = new Parse.Query(clientClass);
    
        clientQuery.find().then(function(clients) {
    
            var totalPromises = [];
    
            clients.forEach(function(client) {
    
                var invoiceHeaderClass = Parse.Object.extend('InvoiceHeader');
                var invoiceHeaderQuery = new Parse.Query(invoiceHeaderClass);
                invoiceHeaderQuery.equalTo('headerClient', client);
    
                var totalPromise = invoiceHeaderQuery.find().then(function(invoiceHeaders) {
                    var totalForHeader = 0;
                    invoiceHeaders.forEach(function(invoiceHeader) {
                        totalForHeader += parseFloat(invoiceHeader.get('headerOutstandingAmount'));
                    });
                    return totalForHeader;
                });
    
                totalPromises.push(totalPromise);
    
            });
    
            return Parse.Promise.when(totalPromises);
    
        }).then(function(totals) {
    
            // here you can use the `totals` array.
    
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2018-11-14
      • 2020-04-17
      • 2017-01-07
      • 1970-01-01
      • 2019-05-25
      • 2014-12-21
      相关资源
      最近更新 更多