2014-12-31 47 views
2

我已經在Parse Cloud Code中創建了後臺作業,它根據我的一個Parse類中的日期發出電子郵件通知。解析JavaScript SDK和Promise鏈接

這裏的想法:查詢包含日期的類。迭代每個返回的對象並檢查日期字段。如果日期等於今天,請發送電子郵件通知,將日期更改爲空並將其保存回分析。

但是,似乎並非所有對象都保存回Parse。我懷疑這是我的諾言鏈的一個問題,但我很難診斷確切的問題或如何解決它。下面是相關的代碼

Parse.Cloud.job("job", function(request, status) { 


// Query for all users 
var query = new Parse.Query(className); 
query.each(function(object) { 

    if (condition) { 

     object.set(key, false); 
     object.save(null, { 
      success:function(object){ 
       // This never executes! 
      }, 
      error: function(error){ 

      } 

     }).then(function(){ 
      // This never executes 
      console.log("Save objects successful"); 
     }, 
     function(error){ 
      status.error("Uh oh, something went wrong saving object"); 
     }); 

     // Set hiatus end successful 
     Mailgun.sendEmail({ 
     }); 
    } 

    }); 
}); 

此行console.log("Save objects successful");在objects.save()承諾鏈就都不曾執行 - 即使在認購對象保存成功解析。

此外,如果查詢返回的對象超過5個,則只有前5個對象成功保存回Parse。任何額外的保存都不會執行,並且不會發送電子郵件通知。

回答

6

我清理如下,依託Promise.when ...

var savePromises = []; // this will collect save promises 
var emailPromises = []; // this will collect email promises 

// your code to setup the query here 
// notice that this uses find() here, not each() 
query.find(function(subscriptions) { 
    _.each(subscriptions, function(subscription) { // or a for loop, if you don't use underscore 

     // modify each subscription, then 
     savePromises.push(subscription.save()); 

     // prepare each email then 
     var emailPromise = Mailgun.sendEmail({ /* your email params object here */ }); 

     emailPromises.push(emailPromise); 
    }); 
    // now do the saves 
    return Parse.Promise.when(savePromises); 
}).then(function() { 
    // now do the emails 
    return Parse.Promise.when(emailPromises); 
}).then(function() { 
    // Set the job's success status 
    status.success("Subscriptions successfully fetched"); 

// and so on with your code 

你也可以考慮結合保存和電子郵件到承諾的一個大陣,但它可能會更好由於它們具有不同的故障模式,所以分兩批連續進行。

+0

爲什麼'返回Parse.Promise.when(savePromises);'在'.each()'回調中? –

+0

@ Roamer-1888,謝謝。修復。 – danh