簡體   English   中英

等待查詢完成后再發送響應

[英]wait for query to finish before sending response

我正在使用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");
                        }
                    });
                });
            };
        }

我認為您需要制作一個Promise系列

參見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分鍾。

希望能幫助到你

看起來您實際上可以在並行查詢(而不是串行查詢)中完成此工作。 我解決了一個類似的問題,我不得不返回布爾結果數組。 如果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);
  });


});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM