主要的承诺链不等待Parse.Query

时间:2014-08-01 17:07:39

标签: javascript parse-platform

我正在尝试在我的matchCenterComparison函数中运行Parse.Query,它是下面主要承诺链的一部分。

当我运行此代码时,它会在('setup query criteria, about to run it');内注销('MatchCenterComparison Succeeded bro!')console.log,但不会注销userCategoryThingQuery.find().then

我在网上研究了这个,并浏览了Parse.Query Documentation,我的结论是主要的承诺链不等待userCategoryThingQuery完成,因为它是异步的。这是导致问题的原因吗?如果是这样,我该如何解决这个问题呢?

主要承诺链:

Parse.Cloud.job("MatchCenterBackground", function(request, status) {
    // ... other code to setup usersQuery ...
  var usersQuery = new Parse.Query(Parse.User);

  usersQuery.each(function (user) {
    return processUser(user).then(function(eBayResults){
      return matchCenterComparison(eBayResults);
    });
  }).then(function() {
    status.success("background job worked brah!");
  }, function(error) {
    status.error(error);
  });
});

matchCenterComparison功能:

function matchCenterComparison(eBayResults) {   

        console.log('eBayResults are the following:' + eBayResults);

        var matchCenterComparisonPromise = new Parse.Promise();

        if (eBayResults.length > 0) {
          // do some work, possibly async
          console.log('yes the ebay results be longer than 0');


          var userCategoryThing = Parse.Object.extend("userCategory");
          var userCategoryThingQuery = new Parse.Query(userCategoryThing);
          userCategoryThingQuery.contains('categoryId', '9355');

          console.log('setup query criteria, about to run it');

          userCategoryThingQuery.find().then(function(results) {
            console.log('lets see what we got here:' + results);
          });


        matchCenterComparisonPromise.resolve(console.log('MatchCenterComparison Succeeded bro!'));
      } else {
        matchCenterComparisonPromise.reject({ message: 'No work done, expression failed' });
      }
      return matchCenterComparisonPromise;  

}  

1 个答案:

答案 0 :(得分:2)

你的问题在这里:

function(request, status) {
    // ... other code to setup usersQuery ...
  var usersQuery = new Parse.Query(Parse.User);

  usersQuery.each(function (user) {
    return processUser(user).then(function(eBayResults){
      return matchCenterComparison(eBayResults);
    });
  })

这是一个问题 - 这个函数会返回什么?

答案 - 它返回undefined。它不会返回承诺,因此链条无需等待。

你需要做的是将你的循环中的所有承诺都带到usersQuery,并返回一个未完成的承诺,直到他们都这样做。尝试重写如下:

function(request, status) {
    // ... other code to setup usersQuery ...
  var usersQuery = new Parse.Query(Parse.User);

  return usersQuery.each(function (user) {
    return processUser(user).then(function(eBayResults){
      return matchCenterComparison(eBayResults);
    });
  }))

查看Parse.Query的文档,重要的是这个:

  

如果回调返回一个promise,迭代将不会继续   直到履行承诺。

  

返回:{Parse.Promise}一旦完成将履行的承诺   迭代已经完成。

所以这应该得到你想要的东西 - usersQuery.each调用将返回一个在迭代结束时完成的promise,并且从回调内部返回promise将意味着迭代在完成所有项目之后才会完成已经处理完毕。