2013-10-17 63 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'内的回调函数应该更好地回报承诺_以便更好地重复使用。 –