我试图在Parse.com云功能的Javascript中实现非常类似的内容:
Parse.Cloud.define("GatherThings", function(req, res) {
var array_whatToGet = req.params.getThese;
var returnVal = {};
if(array_whatToGet.indexOf("Thing1") > -1) {
Parse.Cloud.run("GetThing1", {}, {
success: function(results) {
returnVal['Thing1'] = results;
} //ignoring error for now
}
}
if(array_whatToGet.indexOf("Thing2") > -1) {
Parse.Cloud.run("GetThing2", {}, {
success: function(results) {
returnVal['Thing2'] = results;
} //ignoring error for now
}
}
if(array_whatToGet.indexOf("Thing3") > -1) {
Parse.Cloud.run("GetThing3", {}, {
success: function(results) {
returnVal['Thing3'] = results;
} //ignoring error for now
}
}
res.success(retVal);
}
除此之外可能出现语法错误,当我尝试做这样的事情时,我可以运行所有被调用的云函数,但由于这些云函数的异步质量,我总是在任何事情结束之前进入retVal。
我可以以某种方式链接或阻止它们,使它们不依赖于另一个运行,但最终的返回取决于是否所有内容都已完成?
答案 0 :(得分:1)
这正是承诺的目的。所有Parse函数都返回promise,可以给出一个在完成时运行的方法。 Parse.Promise.when()
采取一系列承诺,并在所有通过的承诺都履行时履行。我们这样使用它:
// underscore.js is a great general purpose utility, mostly self-explanatory
var _ = require('underscore');
Parse.Cloud.define("GatherThings", function(req, res) {
var things = ["Thing1", "Thing2", "Thing3"];
var array_whatToGet = req.params.getThese;
var promises = [];
_.each(things, function(thing) {
if (_.contains(array_whatToGet, thing)) {
promises.push(getThing(thing));
}
});
Parse.Promise.when(promises).then(function(result) {
res.success(result);
}, function(error) {
res.error(error);
});
});
问题没有提到GetThing1,GetThing2和GetThing3是什么,但它暗示它们是其他云功能。从云中调用Cloud.run充其量是不必要的。让我们假设事物指定了一些要查询的对象,并创建一个常规的非云函数,它返回一个执行查询的承诺(查询方法都会这样做)。
function getThing(aThing) {
var query = new Parse.Query("MyClass");
query.equalTo("theThingProperty", aThing);
// query.first() returns a promise that is fulfilled when the query is complete
return query.first();
}