मैं एक वादे के अलावा एक जावास्क्रिप्ट वादा कैसे कर सकता हूं?


38

मेरे पास एक मॉड्यूल में एक विधि के कार्यान्वयन के लिए एक ग्राहक से एक युक्ति है:

 // getGenres():
 //  Returns a promise. When it resolves, it returns an array.

यदि शैलियों की एक सरणी दी जाती है,

['comedy', 'drama', 'action']

यहाँ एक वचन के साथ एक कंकाल विधि है:

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
  });

  return promise;
};

क्या प्रतिज्ञाओं में मिले आंकड़ों को लौटाने का वादा किया जा सकता है? क्या कल्पना विवरण प्राप्त करने का एक बेहतर तरीका है?


8
वादे "वापस" मान नहीं करते हैं, वे उन्हें कॉलबैक (जो आप .then () के साथ आपूर्ति करते हैं) पास करते हैं। कल्पना बस मुझे भ्रमित लगती है। यह शायद यह कहने की कोशिश कर रहा है कि आप resolve([genre1, genre2, ...]);वादे के कार्यान्वयन के अंदर क्या करने वाले हैं।
Ixrec

जवाबों:


40

ऐसा लगता है कि आप समझ नहीं पा रहे हैं कि वादे कैसे किए जाते हैं। तुम एक वादा वापस करो। फिर, बाद में जब आपका कोड वादा पूरा करता है, तो वह इसे एक परिणाम के साथ हल करता है और उस परिणाम को .then()वादे से जुड़े हैंडलर को भेज दिया जाता है :

MovieLibrary.getGenres = function() {
  var promise = new Promise(function(resolve, reject) {
    /* missing implementation */
    resolve(result);
  });

  return promise;
};

MovieLibrary.getGenres().then(function(result) {
    // you can access the result from the promise here
});

5
यह पुष्टि करता है कि वादे उस तरीके से काम करते हैं जिसकी मुझे उम्मीद थी।
सीलोकल

शायद, आप यह नहीं समझते कि इसकी आवश्यकता क्यों हो सकती है। वातावरण में, रिएक्ट के साथ रिएक्ट नेटिव की तरह, मुझे Redux createStore में प्रारंभिक स्थिति डालनी है। इसे दायरे से प्राप्त किया जाना चाहिए, लेकिन यह वादा वापस करता है। मैं केवल तब तक ब्लॉक करना चाहता हूं जब तक यह डेटा नहीं लौटाता क्योंकि यह बहुत तेज और सरल होना चाहिए। इसके बजाय मैं समस्याओं CreateStore () के लिए क्षेत्र का वादा किया और हमेशा की तरह JSON ऑब्जेक्ट गठबंधन करने के लिए कैसे मिलता है
likern

26

के awaitबजाय का उपयोग कर अद्यतन संस्करण .then()

awaitवादा पूरा होने तक हल करना बंद कर देता है (यानी, एक मूल्य है)। .then()आप का उपयोग करने के विपरीत आप awaitमूल्यों को बनाए रख सकते हैं क्योंकि आप विभिन्न कार्यों को चलाते हैं जो वादे वापस करते हैं, और निष्पादन अगली पंक्ति पर जारी रहता है (इसे 'प्रत्यक्ष शैली' कहा जाता है)। यह देखने के लिए बहुत अच्छा है, क्योंकि यह .then()हर जगह की तुलना में जावास्क्रिप्ट के बाकी के अनुरूप है।

// Example function that returns a Promise that will resolve after 2 seconds
var getGenres = function() {
  return new Promise(function(resolve) {
    setTimeout(function(){
      resolve(['comedy', 'drama', 'action'])
    }, 2000);
  });
}

// We start an 'async' function to use the 'await' keyword
(async function(){
  var result = await getGenres()
  console.log('Woo done!', result)

  // But the best part is, we can just keep awaiting different stuff, without ugly .then()s
  var somethingElse = await getSomethingElse()
  var moreThings = await getMoreThings()
})()

प्रतीक्षा सभी वर्तमान ब्राउज़रों और नोड में समर्थित है


1
ओह हे वाह देखो, इस विषय पर 3 एसई प्रश्न और अंत में हमारे पास एक वास्तविक उत्तर है!
एंड्रयू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.