2013-11-04 6 views
9

क्या क्लाउड कोड में नेस्टेड प्रश्न करना संभव है?क्लाउड कोड (Parse.com) में जावास्क्रिप्ट का उपयोग करके नेस्टेड प्रश्न

मैं की तरह

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"); 
} 
}); 

मैं यह कर की कोशिश की कुछ करने के लिए सक्षम होना चाहते हैं, लेकिन भीतरी क्वेरी कभी नहीं निष्पादित करता है। क्यूं कर?

उत्तर

14

दूसरी क्वेरी एसिंक्रोनस है इसलिए for में इसे लपेटना काम नहीं करेगा।

response.success दूसरी क्वेरी समाप्त होने से पहले ट्रिगर हो जाता है ताकि आप वास्तव में परिणामों की प्रतीक्षा करने से पहले लौट सकें। मैं आपको query2 के कॉलबैक के अंदर response.success स्थानांतरित करने के लिए कहूंगा लेकिन यह तब तक काम नहीं करेगा जब आप for के अंदर एक एसिंक ऑपरेशन सिंक्रनाइज़ेशन चला रहे हैं ताकि आप पहले success में प्रतिक्रिया भेज सकें।

लूप के अंदर एसिंक ऑपरेशन न चलाएं। यह काम नहीं करता है।

मुझे यकीन नहीं है कि आप यहां क्या करने की कोशिश कर रहे हैं, लेकिन यदि आप परिणाम के रूप में कई प्रश्न पूछना चाहते हैं तो आपको प्रत्येक कॉल के लिए एक नया Query तत्काल करना होगा।

फिर, मुझे यकीन है कि वास्तव में क्या आप क्या करने की कोशिश कर रहे हैं नहीं कर रहा हूँ, लेकिन यहाँ एक तरह से आप ऐसा ही कुछ कर सकते हैं:

मन में
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"); 
     } 
    }); 

बार पार्स बादल कोड है कि आप के लिए कोड को चलाने aprox 5/7 सेकेंड और यदि आपके पास बहुत सारे results हैं तो यह बहुत धीमा हो सकता है। बीटीडब्ल्यू, एक पार्स की 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. 
     } 
    });   
+2

'matchQuery' के लिए +1! –

1

मुझे लगता है कि नीचे कोड किसी की मदद कर सकते हैं,

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); 
}); 
0

मैं निम्नलिखित जवाब ऊपर पक्की सड़क के लिए सक्षम था। यह मेरे लिए काम करता है। समांतर वादे के लिए 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"); 
    }); 
}); 
संबंधित मुद्दे