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