javascript - समारोह जावास्क्रिप्ट पोस्ट से रिक्त वापस आ जाएगी/प्राप्त करें



node.js callback (1)

जावास्क्रिप्ट पर नया, और बस कॉलबैक और वादे के बारे में पढ़ना शुरू कर दिया। मुझे "प्रतीक्षा" की अवधारणा को समझ में नहीं आता है जब तक मेरे पास POST / GET अनुरोध से कोई मान नहीं होता है

अधिक विशिष्ट, यह काम क्यों नहीं करेगा?

var token = null;

/
/ var options = {headers, form, etc}
/

function getToken() {

    request(options)
        .then(function (parsedBody) {
            this.token = parsedBody
        })
        .catch(function (err) {
                console.log('POST-Error')
    })

    return token
}

console.log(getToken())

मैं 'अनुरोध-वादा' का प्रयोग कर रहा हूं, जो कि नोडजे में है। जैसा कि मैं समझता हूं जब अनुरोध किया जाता है, तो टोकन वैरिएबल एक वादे के बाद से तय किया जाएगा, है ना?


यह जटिल है और मैं आपको दोष नहीं देता कि आप भ्रमित हैं। नोड के लिए हर कोई उस के साथ भ्रमित होने लगता है

आपकी समस्या यह है कि वेरिएबल सही ढंग से बदल जाएगा - बस अभी तक नहीं है जब console.log() चलाया जाता है।

जब कोई फ़ंक्शन वादा करता है तो इसका मतलब है कि भविष्य में कुछ होगा - संभवतया एक पल में, हो सकता है बाद में, लेकिन तब तक नहीं, जब वह समारोह वादा करता है

फिर आप वादा करने के लिए एक पूर्णता और अस्वीकृति संचालकों को जोड़ सकते हैं - वादा वास्तव में हल हो जाने पर उन हैंडलरों को बुलाया जाएगा (यानी अनुरोध द्वारा कुछ डेटा वापस किया गया है, या कोई त्रुटि है)।

तो, आप नहीं लिख सकते हैं:

console.log(getToken());

आप क्या लिख ​​सकते हैं:

getToken()
    .then(data => console.log('Data:', data))
    .catch(error => console.log('Error:', error));

लेकिन जब आप वास्तव में अपने कार्य से वादा वापस लेते हैं:

function getToken() {
    let promise = request(options);
    return promise;
}

अब, आप एक async कीवर्ड का उपयोग कर सकते हैं और ऐसा कुछ कर सकते हैं:

async function getToken() {
    let data = await request(options);
    return data;
}

लेकिन यह फ़ंक्शन data वापस नहीं करता - यह पिछले उदाहरण की तरह ही वादा करता है

एक बात याद रखें जो आप अपने फ़ंक्शन से कोई भी मूल्य नहीं लौटा सकते जो अभी तक उपलब्ध नहीं है। यदि आप कुछ भी वापस करना चाहते हैं तो आप केवल एक वादा वापस कर सकते हैं। और हर एसिंक्रोनस फ़ंक्शन - चाहे वह async function , एक फ़ंक्शन जो स्पष्ट रूप से एक वादा या एक फ़ंक्शन जो एक कॉलबैक लेता है देता है - थ्रेड को अवरोधित किए बिना, अतुल्यकालिक कार्यवाही से पहले वापस आ जाएगा।

अधिक जानकारी के लिए उन उत्तरों में से कुछ देखें:






promise