是否可以在云代码中进行嵌套查询?
我想要做一些类似的事情
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"); } });
我尝试这样做,但内部查询从不执行.为什么?
解决方法
第二个查询是异步的,因此将其包装在一个不会工作.
response.success在第二个查询完成之前被触发,所以在实际等待结果之前返回.我会告诉你在response2的第二个成功回调里面移动response.success,但是由于你在一个内部同步运行一个异步操作,所以不会工作,所以你将在第一个成功的时候发送响应.
不要在循环中运行异步操作.它不工作
我不知道你想在这里完成什么,但是如果您想要做出与查询结果一样多的查询,则必须为每个通话实例化一个新的查询.
再次,我不知道你正在努力做什么,但这里是一种你可以做的事情:
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"); } });
请记住,Parse Cloud Code允许您运行aprox 5/7秒的代码,如果您有很多结果,这可能非常慢.
Btw,看看一个Parse的matchesQuery方法.
从他们的文档取得的例子:
var Post = Parse.Object.extend("Post"); var Comment = Parse.Object.extend("Comment"); var innerQuery = new Parse.Query(Post); innerQuery.exists("image"); var query = new Parse.Query(Comment); query.matchesQuery("post",innerQuery); query.find({ success: function(comments) { // comments now contains the comments for posts with images. } });