在云代码(Parse.com)中使用javascript的嵌套查询
是否可以在云代码中执行嵌套查询 我想做一些像这样的事情在云代码(Parse.com)中使用javascript的嵌套查询,javascript,parse-platform,Javascript,Parse Platform,是否可以在云代码中执行嵌套查询 我想做一些像这样的事情 var adList = []; var query2 = new Parse.Query("QR"); var query = new Parse.Query("Campaigns"); query.equalTo("isFeatured", true); query.find({ success: function(results) { for (var i=0; i<results.length; i++){
var adList = [];
var query2 = new Parse.Query("QR");
var query = new Parse.Query("Campaigns");
query.equalTo("isFeatured", true);
query.find({
success: function(results) {
for (var i=0; i<results.length; i++){
var ad = [];
ad.push(results[i].get("Type")); //Adds "Type" to the ad array
ad.push(results[i].id); //gets the objectID and appends it to the arrayy
//second INNER QUERY
query2.equalTo("abc", true);
adList.push(ad);
query2.first({
success: function(results){
adList.push(5);
},
error: function(){
response.error("inner fail");
}
});
}
response.success(adList); //adds all ad arrays to adList array
},
error: function(){
response.error("failed");
}
});
var adList=[];
var query2=新的Parse.Query(“QR”);
var query=newparse.query(“活动”);
query.equalTo(“isFeatured”,true);
查询.查找({
成功:功能(结果){
对于(var i=0;i第二个查询是异步的,因此将其包装在for
中将不起作用
response.success
在第二个查询完成之前被触发,因此您在实际等待结果之前返回。我会告诉您将response.success
移动到query2
的第二个success
回调中,但这也不起作用,因为您正在同步运行异步操作在一个for
中插入一个,这样您将在第一次成功时发送响应
不要在循环内运行异步操作。它不起作用
我不确定您在这里想要完成什么,但是如果您想进行与结果一样多的查询,您必须为每个调用实例化一个新的查询
同样,我不确定你到底想做什么,但这里有一种方法可以让你做到:
var adList = [];
var query = new Parse.Query("Campaigns");
query.equalTo("isFeatured", true);
query.find({
success: function(results) {
var queries = [];
for (var i=0; i<results.length; i++){
var query2 = new Parse.Query("QR");
query2.equalTo("abc",true);
var ad = [];
ad.push(results[i].get("Type"));
ad.push(results[i].id);
adList.push(ad);
queries.push(query2);
}
var totalLength = results.length;
function makeQueries(qs){
qs.shift().first({
success: function(currentResult) {
// do stuff with currentResult
if(qs.length){
makeQueries(qs);
} else {
console.log('We successfully made ' + totalLength + ' queries')
// we are done with the queries
response.success(adList);
}
},
error: function() {
response.error('Error in inner queries nº' + totalLength - qs.length)
}
});
}
makeQueries(queries);
},
error: function(){
response.error("failed");
}
});
我认为下面的代码可能会帮助一些人
var adList = [];
var query2 = new Parse.Query("QR");
var query = new Parse.Query("Campaigns");
query.equalTo("isFeatured", true);
query.find().then(function(results) {
var _ = require('underscore');
var promise = Parse.Promise.as();
_.each(results, function(resultObj) {
var ad = [];
ad.push(resultObj.get("Type")); //Adds "Type" to the ad array
ad.push(resultObj.id); //gets the objectID and appends it to the arrayy
//second INNER QUERY
query2.equalTo("abc", true);
adList.push(ad);
return query2.first().then(function(results) {
adList.push(5);
});
});
return promise;
}).then(function() {
response.success(adList);
}, function (error) {
response.error("Error "+error.message);
});
我能够拼凑出以下答案。这对我很有用。遵循parse.com文档中关于并行承诺的指导原则。我创建了两个承诺数组。其中一个用作内部循环的承诺数组。另一个用作外部循环的承诺数组
Parse.Cloud.define("getFriends", function (request, response) {
var _ = require('underscore.js');
var queryFields = request.params.queryFields;
//var ClassToSearch = Parse.Object.extend("User");
var promises = [];
var promises2 = [];
var FinalResult = [];
var asyncFunc = function (userIDArray) {
_.each(queryFields, function (queryField) {
var query = new Parse.Query(Parse.User);
query.equalTo("yourColumnName", queryField);
promises.push(
query.find().then(function (results) {
_.each(results, function (resultObj) {
//nested query
var ClassToSearch = Parse.Object.extend("AnotherColumn");
var query2 = new Parse.Query(ClassToSearch);
query2.equalTo("yourColumnName", resultObj);
promises2.push(
query2.first().then(function (itinerary) {
FinalResults.push(itinerary);
}));
});
return Parse.Promise.when(promises2);
})
)
});
// Return a new promise that is resolved when all of the requests are done
return Parse.Promise.when(promises);
};
asyncFunc(queryFields).then(function () {
console.log("all http requests were made");
response.success(FinalResults);
}, function (error) {
console.log("there was some error");
});
});
Parse.Cloud.define("getFriends", function (request, response) {
var _ = require('underscore.js');
var queryFields = request.params.queryFields;
//var ClassToSearch = Parse.Object.extend("User");
var promises = [];
var promises2 = [];
var FinalResult = [];
var asyncFunc = function (userIDArray) {
_.each(queryFields, function (queryField) {
var query = new Parse.Query(Parse.User);
query.equalTo("yourColumnName", queryField);
promises.push(
query.find().then(function (results) {
_.each(results, function (resultObj) {
//nested query
var ClassToSearch = Parse.Object.extend("AnotherColumn");
var query2 = new Parse.Query(ClassToSearch);
query2.equalTo("yourColumnName", resultObj);
promises2.push(
query2.first().then(function (itinerary) {
FinalResults.push(itinerary);
}));
});
return Parse.Promise.when(promises2);
})
)
});
// Return a new promise that is resolved when all of the requests are done
return Parse.Promise.when(promises);
};
asyncFunc(queryFields).then(function () {
console.log("all http requests were made");
response.success(FinalResults);
}, function (error) {
console.log("there was some error");
});
});