如何阻止多个异步Parse云调用直到完成?

时间:2015-07-14 00:37:21

标签: javascript asynchronous parse-platform

我试图在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。

我可以以某种方式链接或阻止它们,使它们不依赖于另一个运行,但最终的返回取决于是否所有内容都已完成?

1 个答案:

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