在发送响应之前等待查询完成

时间:2014-03-10 09:41:55

标签: javascript parse-platform

我正在使用Cloud Code在服务器端执行某些操作。在我的代码中,我必须做一系列查询,这些查询应该在while循环中完成。这些查询应该在彼此之后完成。当我运行代码时,它会进入每个查询并在完成查询之前返回,因此会出现套接字超时连接错误。有没有办法在继续之前等待查询完成?任何例子都将受到高度赞赏。谢谢。

编辑:这是一段代码片段

while (i < cities.length-1){
            if (query) {
                query = false;
                cities.forEach(function(object){
                    var query = new Parse.Query("pictures");
                    query.descending("likes");
                    query.equalTo("city", object);
                    query.limit(1);
                    query.find().then(function(results){
                        success: function(results) {
                            var tempArray = new Array();
                            tempArray = results;

                            rankedPosts = rankedPosts.concat(tempArray);

                            query = true;
                            i++;
                        }, error: function() {
                            response.error("Error");
                        }
                    });
                });
            };
        }

2 个答案:

答案 0 :(得分:2)

我认为您需要制作承诺系列

请参阅https://parse.com/docs/js_guide#promises-series

做这样的事情:

  // Create a trivial resolved promise as a base case.
  var promise = Parse.Promise.as();

  var finalResults = [];

  // for all the objects in the array...
  _.each(cities, function(objectX) { // the "_" is given by using "var _ = require('underscore');" at the beginning of your module

       // For each item, extend the promise with a function to query specified objectX
       promise = promise.then(function() {

           var subPromise = new Parse.Promise();

           var query = new Parse.Query("pictures");
           query.descending("likes");
           query.equalTo("city", objectX);
           query.limit(1);

           query.find().then(function(results) {

               // append cur results to final results
               finalResults = _.union (finalResults,results);
               subPromise.resolve(results);

           }, function(error) {

               subPromise.reject(error);

           });

           return subPromise;
       });

  });
  return promise;

}).then(function() {

  // When all queries have been performed

});

我没有测试过这段代码,但我已经成功使用了这样的东西。

无论如何,请记住Parse.com对请求持续时间的限制。 所以,事件监听器中的3秒(如beforeSave或afterSave),在7秒内 自定义功能,后台作业最多15分钟。

希望有所帮助

答案 1 :(得分:1)

看起来你实际上可以在并行查询(而不是系列)中完成这项工作。我解决了一个类似的问题,我必须返回一个布尔结果数组。如果ParseUser与请求数组中的某个电话号码一起存在,则必须返回true / false。

灵感来自:https://parse.com/docs/js_guide#promises-parallel

Parse.Cloud.define("phone_search", function(request, response) {

  var list = request.params.phones;

  //Initialize result array
  var finalResults = [];
  for (var i = 0; i < list.length; i++){
    finalResults[i] = false;
  }

  Parse.Promise.as().then(function() {
    // Collect one promise for each query into an array.
    var promises = [];

    for (var i = 0; i < list.length; i++){
      (function (j) {  //create new closure so i changes with each callback
          var number = list[j];
          var query = new Parse.Query('_User');
          query.equalTo("phoneNumber", number);

          promises.push(
            query.find({
              success: function(results) {
                if (results.length > 0) {
                  console.log("Found one:"+number); 
                  finalResults[j] = true;
                }
              },
              error: function() {
                response.error();
              }
            })        
          );
      })(i);
    }
    // Return a new promise that is resolved when all of the queries are finished.
    return Parse.Promise.when(promises);

  }).then(function() {
    console.log(finalResults); 
    response.success(finalResults);
  });


});