2013-10-17 81 views
1

我是一個剛剛接觸異步問題的新手編碼器。爲了簡單起見,我創建了一個快速示例來說明我的問題。我有一個簡單的函數來運行查詢,結果是調用2個其他雲功能。然後嘗試爲返回的對象和.save()設置值。除了.save()之外,一切都似乎正確執行。我試過使用promises/.thens和其他一些技巧,但沒有任何工作。如果有人能夠提供最簡單直接的解決方案,我會非常感激。解析雲代碼:如何調用異步保存的承諾

Parse.Cloud.define("test", function(request,response){ 
    query.equalTo("name",request.params.name); 
    query.first(
     success: function(result){ 
      result.set("testAverage", Parse.Cloud.run("calcAverage",{"name":request.params.name,"type":"test"})); 
      result.set("quizAverage", Parse.Cloud.run("calcAverage",{"name":request.params.name,"type":"quiz"})); 
      result.save(); 
     }, 
     error: function(){ 
      response.error("error"); 
     } 
    ); 
    return result; 
}); 

P.S.在我的實際情況中,有10-20個並行呼叫到其他雲功能,而不僅僅是2.

謝謝!

回答

2

我相信你正在編寫的東西,result.save()可能會在你的雲功能能夠返回之前被調用。我也不確定request.params.name在您的成功回調函數內引用時會正常工作。

確保您解析的版本支持的承諾,然後嘗試舉辦這樣的代碼:

function queryTestAverage(name) { 
    return Parse.Cloud.run("calcAverage",{"name":request.params.name,"type":"test"}); 
} 

Parse.cloud.define("test", function(request, response) { 

    query.equalTo("name", request.params.name); 
    return query.first() 
}) 
.then(function(results) { 
    var name = results.get("name"); 
    Parse.Promise.when([queryTestAverage(name), queryQuizAverage(name)]).then(
     function(result1, result2) { 
      results.set("testAverage", result1); 
      results.set("quizAverage", result2); 
      results.save(); 
     } 

} 

注:上面的代碼是爲樣本,可能無法正常工作的。

信息來源:

+0

另外,你提到你有10個-20個並行調用...我對分析不太熟悉,它是否爲你做了這個優化,但我會考慮創建一個超級函數來包裝所有這些樂趣在一次通話中,您只需觸碰一次服務器。 – JPatrick

+0

我嘗試過這樣做,但它不起作用。我使用「結果」而不是「結果」,並且當查詢返回結果時,如果嘗試.get()任何屬性,它將返回「undefined」。另外.save()不起作用。我還在解析博客上發佈了更深入的示例:https://www.parse.com/questions/cloud-code-problem-with-promises-and-saving-parse-objects – BinarySolo

+0

'.then'內的回調函數應該更好地回報承諾_以便更好地重複使用。 –