2015-06-02 5 views
0

Я пишу некоторые коды JavaScript, используя Parse.com.Как правильно использовать Parse/Promise?

Честно говоря, я читал, как использовать Promise и сделано много исследований, но все еще не может понять, как правильно его использовать ..

Вот сценарий:

  1. у меня есть две таблицы (объекты) называется Client и InvoiceHeader
  2. Клиент может иметь несколько InvoiceHeader с.
  3. InvoiceHeader имеет столбец под названием «Сумма», и я хочу, чтобы общая сумма каждого клиента InvoiceHeader s.

Например, если клиент А имеет два InvoiceHeader сек с количеством 30 и 20, и Клиент Б не имеет ничего, результат я хочу видеть в 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... 
    }); 
}); 

ответ

1

Предполагая Promise класс Parse.com следует за 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. 

    }); 
}); 
Смежные вопросы