Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析云代码:如何调用异步保存承诺_Javascript_Asynchronous_Parse Platform_Promise - Fatal编程技术网

Javascript 解析云代码:如何调用异步保存承诺

Javascript 解析云代码:如何调用异步保存承诺,javascript,asynchronous,parse-platform,promise,Javascript,Asynchronous,Parse Platform,Promise,我是一个初出茅庐的程序员,不熟悉异步问题。为了简单起见,我创建了一个快速示例来说明我的问题。我有一个简单的函数,它运行一个查询,并根据查询结果调用另外两个云函数。然后,它尝试为返回的对象设置.set值,并将其保存为.save()。除了.save()之外,所有操作似乎都正确执行。我尝试过使用promises/.thens和其他一些技巧,但都没有效果。如果有人能提供最简单、最直接的解决方案,我将不胜感激 Parse.Cloud.define("test", function(request,resp

我是一个初出茅庐的程序员,不熟悉异步问题。为了简单起见,我创建了一个快速示例来说明我的问题。我有一个简单的函数,它运行一个查询,并根据查询结果调用另外两个云函数。然后,它尝试为返回的对象设置.set值,并将其保存为.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;
}); 
另外,在我的实际场景中,有10-20个对其他云函数的并行调用,而不仅仅是2个


谢谢

我相信,按照您当前的编码方式,可能会在云函数返回之前调用result.save()。我也不确定request.params.name在成功回调函数中被引用时是否能正常工作

确保您的parse版本支持承诺,然后尝试按如下方式组织代码:

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();
        }

}
注意:以上代码用于示例,可能无法正常工作

信息来源:

  • 一般承诺:
  • 将.when()同时用于多个承诺:

另外,您提到您有10-20个并行电话。。。我不太熟悉解析,它是否为你做了这个优化,但是我会考虑创建一个超级函数来把所有这些函数打包在一个调用中,这样你就只会击中一次服务器。我试着这样做,但是它不太有效。我使用了“result”而不是“results”,虽然查询返回了一个结果,但如果我尝试.get()任何属性,它将返回“undefined”。此外,.save()也不起作用。我还在parse博客上发布了一个更深入的例子:
中的回调函数。那么
应该更好地返回承诺,以便更好地重用。