वादे से लौटो तब ()


118

मुझे इस तरह एक जावास्क्रिप्ट कोड मिला है:

function justTesting() {
  promise.then(function(output) {
    return output + 1;
  });
}

var test = justTesting();

मुझे हमेशा var टेस्ट के लिए अपरिभाषित मान मिला है। मुझे लगता है कि यह इसलिए है क्योंकि वादे अभी तक हल नहीं हुए हैं..तो क्या एक वादा से एक मूल्य वापस करने का एक तरीका है?


21
किसी then()कॉल का रिटर्न मान फिर से एक वादा है, जो आपके द्वारा दिए गए मूल्य को लपेटता है।
सिरको

आपके पास एक सिंटैक्स त्रुटि है, मुझे नहीं लगता कि यह भी पार्स करता है।
djechlin

4
परीक्षण अपरिभाषित है क्योंकि जस्टटाइटिंग आपके उदाहरण में कुछ भी नहीं देता है (आपके पास कोई रिटर्न नहीं है)। रिटर्न जोड़ें और परीक्षण को एक वादा के रूप में परिभाषित किया जाएगा।
जेरोम वैगनर

1
प्रतिक्रिया के लिए धन्यवाद .. बिंदु परीक्षण करने के लिए आउटपुट +1 असाइन करना है।
प्रिसी

4
चर क्या है promise? आप इसे कहीं भी परिभाषित नहीं करते हैं और आप अपने justTesting()कार्य से कुछ भी वापस नहीं करते हैं। यदि आप बेहतर सहायता चाहते हैं, तो आपको यह वर्णन करने की आवश्यकता है कि जिस समस्या को आप हल करने की कोशिश कर रहे हैं वह केवल हमें कोड दिखाने के बजाय "बंद" है कि यह भी स्पष्ट नहीं करता है कि आप वास्तव में क्या करने की कोशिश कर रहे हैं। उस समस्या की व्याख्या करें जिसे आप हल करने का प्रयास कर रहे हैं।
jfriend00

जवाबों:


136

जब आप किसी then()कॉलबैक से कुछ वापस करते हैं , तो यह थोड़ा जादू होता है। यदि आप एक मान लौटाते हैं, तो अगला then()उस मान के साथ कहा जाता है। हालाँकि, यदि आप कुछ वादा-जैसे वापस करते हैं, तो अगला then()उस पर इंतजार करता है, और केवल तभी बुलाया जाता है जब वह वादा निपट जाता है (सफल / असफल)।

स्रोत: https://developers.google.com/web/fundamentals/getting-started/primers/promises#queuing-asynchronous-actions


इस कारण की वजह से की तरह लग, तो मैं अजाक्स के साथ सरणी पुनरावृत्ति के लिए वादा श्रृंखला कर सकते हैं तुल्यकालिक में अनुरोध करता है stackoverflow.com/q/53651266/2028440
Bằng Rikimaru

83
सवाल का जवाब नहीं दिया।
एंड्रयू

संबंधित लिंक
मैरिनो एक

1
तो उपाय क्या है?
अपूर्वा

58

एक वादे का उपयोग करने के लिए, आपको या तो एक फ़ंक्शन कॉल करना होगा जो एक वादा करता है या आपको स्वयं एक बनाना होगा। आप वास्तव में यह वर्णन नहीं करते हैं कि आप वास्तव में किस समस्या को हल करने की कोशिश कर रहे हैं, लेकिन यहां बताया गया है कि आप स्वयं एक वादा कैसे करेंगे:

function justTesting(input) {
    return new Promise(function(resolve, reject) {
        // some async operation here
        setTimeout(function() {
            // resolve the promise with some value
            resolve(input + 10);
        }, 500);
    });
}

justTesting(29).then(function(val) {
   // you access the value from the promise here
   log(val);
});

// display output in snippet
function log(x) {
    document.write(x);
}

या, यदि आपके पास पहले से ही एक फ़ंक्शन है जो एक वादा लौटाता है, तो आप उस फ़ंक्शन का उपयोग कर सकते हैं और अपना वादा वापस कर सकते हैं:

// function that returns a promise
function delay(t) {
  return new Promise(function(resolve) {
    setTimeout(function() {
      resolve();
    }, t);
  });
}

function justTesting(input) {
  return delay(100).then(function() {
    return input + 10;
  });
}

justTesting(29).then(function(val) {
  // you access the value from the promise here
  log(val);
});

// display output in snippet
function log(x) {
  document.write(x);
}


2
जो मुझे फेंकता है वह दोहरा है return, यानी justTestingकहता है return.then => return। मुझे पता है कि यह काम करता है bcs मैंने इसे लागू किया है (bcs linting ने मुझे मजबूर किया, इससे दूर new Promise), लेकिन क्या आप बता सकते हैं कि उस रिटर्न / रिटर्न जोड़ी को कैसे समझना / सोचना है?
रॉनी रोइस्टन

2
@RonRoyston - सबसे पहले, आप जिस फ़ंक्शन को पास करते हैं, वह फ़ंक्शन .then()से एक अलग फ़ंक्शन होता है इसलिए जब इसे कॉल किया जाता है, तो इसका अपना वापसी मूल्य होता है। दूसरे, एक .then()हैंडलर से वापसी मूल्य वादे का हल हो जाता है। तो, .then(val => {return 2*val;})से हल मान बदल रहा valहै 2*val
jfriend00

13

मैंने यहाँ क्या किया है कि मैंने जस्टटीस्टिंग फ़ंक्शन से एक वादा वापस किया है। आप तब परिणाम प्राप्त कर सकते हैं जब फ़ंक्शन हल हो गया है।

// new answer

function justTesting() {
  return new Promise((resolve, reject) => {
    if (true) {
      return resolve("testing");
    } else {
      return reject("promise failed");
   }
 });
}

justTesting()
  .then(res => {
     let test = res;
     // do something with the output :)
  })
  .catch(err => {
    console.log(err);
  });

उम्मीद है की यह मदद करेगा!

// old answer

function justTesting() {
  return promise.then(function(output) {
    return output + 1;
  });
}

justTesting().then((res) => {
     var test = res;
    // do something with the output :)
    }

क्या होगा यदि "// आउटपुट के साथ कुछ करें" मैंने रिटर्न स्टेटमेंट डाला? उदाहरण के लिए: मेरे पास "JustTesting () तब ..." एक मूल फ़ंक्शन के भीतर होगा। क्या मैं "तब" भाग के भीतर कोई मान वापस कर पाऊंगा?
श्रीजपका

यदि आप // से कुछ मान वापस करना चाहते हैं, तो आउटपुट के साथ कुछ करें, आपको justTesing () से पहले रिटर्न जोड़ना होगा। उदाहरण, "रिटर्न जस्टटस्टिंग ()। तब ((रेस) => {रिटर्न रेस;});
विदुर सिंगला

ठीक है कि मैं क्या उम्मीद थी, मैं सिर्फ यह सुनिश्चित करना चाहता था :) धन्यवाद!
मृजेपका

क्या होगा यदि हम तब से परीक्षण लौटाते हैं?
मेवलमकुमार

3

मैं "वेट" कमांड का उपयोग करना पसंद करता हूं और वादों के भ्रम से छुटकारा पाने के लिए async फ़ंक्शन करता हूं,

इस मामले में, मैं पहले एक एसिंक्रोनस फ़ंक्शन लिखूंगा, इसका उपयोग इस प्रश्न के "वादे" के तहत किए गए अनाम फ़ंक्शन के बजाय किया जाएगा:

async function SubFunction(output){

   // Call to database , returns a promise, like an Ajax call etc :

   const response = await axios.get( GetApiHost() + '/api/some_endpoint')

   // Return :
   return response;

}

और फिर मैं इस फ़ंक्शन को मुख्य फ़ंक्शन से कॉल करूंगा:

async function justTesting() {
   const lv_result = await SubFunction(output);

   return lv_result + 1;
}

यह देखते हुए कि मैं यहाँ async फ़ंक्शन के लिए मुख्य फ़ंक्शन और सब फ़ंक्शन लौटाता हूं।


ठीक है ... प्रतीक्षा का उपयोग करके इसे बहुत क्लीनर बनाया गया और साथ ही इस मुद्दे को हल किया गया
कार्तिकेयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.