Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在云代码(Parse.com)中使用javascript的嵌套查询_Javascript_Parse Platform - Fatal编程技术网

在云代码(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");
  });
});