2015-01-03 9 views
65

मैं अभी भी वादे के साथ संघर्ष कर रहा हूं, लेकिन समुदाय को कुछ प्रगति धन्यवाद।फ़ंक्शन के चर को वापस करने से पहले मैं समाप्त होने का वादा कैसे करूं?

मेरे पास एक साधारण जेएस फ़ंक्शन है जो एक पार्स डेटाबेस से पूछताछ करता है। यह परिणामों की सरणी वापस करने के लिए माना जाता है, लेकिन जाहिर है कि क्वेरी की असीमित प्रकृति (इसलिए वादे) के कारण, फ़ंक्शन परिणामों से पहले लौटाता है, जिससे मुझे एक अपरिभाषित सरणी मिलती है।

इस समारोह को वादे के परिणाम के लिए प्रतीक्षा करने के लिए मुझे क्या करने की ज़रूरत है?

function resultsByName(name) 
{ 
    var Card = Parse.Object.extend("Card"); 
    var query = new Parse.Query(Card); 
    query.equalTo("name", name.toString()); 

    var resultsArray = []; 

    var promise = query.find({ 
       success: function(results) { 
       // results is an array of Parse.Object. 
          console.log(results); 
          //resultsArray = results; 
          return results; 
       }, 

       error: function(error) { 
       // error is an instance of Parse.Error. 
          console.log("Error"); 
       } 
    });       

} 
+1

आप एसिंक/प्रतीक्षा का भी उपयोग करने पर विचार कर सकते हैं। संस्करण 7.6 –

उत्तर

29
बजाय एक resultsArray आप एक परिणाम सरणी के लिए एक वादा वापसी और उसके बाद then कॉल साइट पर है कि लौटने का

function resultsByName(name) 
{ 
    var Card = Parse.Object.extend("Card"); 
    var query = new Parse.Query(Card); 
    query.equalTo("name", name.toString()); 

    var resultsArray = []; 

    return query.find({});       

} 

// later 
resultsByName("Some Name").then(function(results){ 
    // access results here by chaining to the returned promise 
}); 

आप Parse's own blog post about it में प्रश्नों के साथ पार्स वादों उपयोग के अधिक उदाहरण देख सकते हैं: - कोडिंग जावास्क्रिप्ट में संगामिति कि पर आधारित है आप this question को पढ़ने के लिए एक व्यापक विचार प्राप्त कर सकते हैं।

+0

क्या आप मुझे बता सकते हैं कि इसका क्या समर्थन है? आईई 9 इसका समर्थन करता है? –

+0

हां, लेकिन पार्स स्वयं ज्यादातर मर चुका है इसलिए @SandrinaPereira है। यह parse _cloud_ कोड है। –

+0

आह तो यह केवल शुद्ध जावास्क्रिप्ट नहीं है? मैं ऐसा करने का एक तरीका ढूंढ रहा था (किसी अन्य कार्य को शुरू करने के लिए एक फ़ंक्शन की प्रतीक्षा करें) लेकिन केवल शुद्ध जावास्क्रिप्ट के साथ .. –

5

आप समारोह इंतजार नहीं करना चाहते हैं, क्योंकि जावास्क्रिप्ट गैर अवरुद्ध करने का इरादा है,:

यहाँ मेरी कोड है। इसके बजाय फ़ंक्शन के अंत में वादा वापस कर दें, फिर कॉलिंग फ़ंक्शन सर्वर प्रतिक्रिया प्राप्त करने के वादे का उपयोग कर सकता है। इस फोन करने वाले समारोह जानने अतुल्यकालिक मैं/हे प्रदर्शन कर रहा है के अतिरिक्त लाभ है -

var promise = query.find(); 
return promise; 

//Or return query.find(); 
+0

के बाद से नोड बॉक्स के बाहर async/प्रतीक्षा करने का समर्थन करता है 'सफलता:' बिट के साथ आपकी पूरी कॉलबैक चीज़ बंद है। –

+0

या बेहतर: 'वापसी क्वेरी। ढूँढें();'। – mash

+0

भी ठीक है। मैं इसे इस तरह के उद्देश्य के लिए छोड़ दूंगा लेकिन इसे टिप्पणी के रूप में जोड़ा। – Trace

2

आप वास्तव में यहां वादे का उपयोग नहीं कर रहे हैं। पार्स आपको कॉलबैक या वादे का उपयोग करने देता है; आपकी पसंद।

वादों का उपयोग करने के लिए, निम्न कार्य करें:

query.find().then(function() { 
    console.log("success!"); 
}, function() { 
    console.log("error"); 
}); 

अब, सामान पर अमल करने के बाद वादा पूरा हो गया है, तो आप सिर्फ then() कॉल के अंदर वादा कॉलबैक अंदर निष्पादित कर सकते हैं। अब तक यह नियमित कॉलबैक के समान ही होगा।

वास्तव में वादों का अच्छा इस्तेमाल करने के लिए है जब आप उन्हें श्रृंखला, इस तरह:

query.find().then(function() { 
    console.log("success!"); 

    return new Parse.Query(Obj).get("sOmE_oBjEcT"); 
}, function() { 
    console.log("error"); 
}).then(function() { 
    console.log("success on second callback!"); 
}, function() { 
    console.log("error on second callback"); 
}); 
+0

परिणाम वस्तु किस प्रकार की वस्तु है? क्योंकि इसमें मेरी सरणी –

+0

नहीं लगती है, यह 'Parse.Object' की सरणी होनी चाहिए। – mash

0

क्या मैं वादा का परिणाम के लिए इस समारोह इंतजार बनाने के लिए क्या करना होगा?

उपयोग async/await (ECMA6 का हिस्सा नहीं है, लेकिन क्रोम, एज, Firefox और Safari के लिए उपलब्ध 2017 के अंत के बाद से, canIuse देख)
MDN

async function waitForPromise() { 
     let result = await Promise.resolve('this is a sample promise'); 
    } 

के रूप में एक sidenote: सी # चल रहा है यह कुछ साल पहले (!) पहले से ही है।

संबंधित मुद्दे

 संबंधित मुद्दे