2016-11-09 6 views
7

मैंने ES7 सुविधा async/await का उपयोग करना शुरू किया, जो एसिंक्रोनस कार्यों से निपटने के लिए सबसे अच्छा तरीका प्रदान करता है, और आपके कोड क्लीनर और पठनीय बनाता है।क्या वापसी के बिना एसिंक फ़ंक्शन को हल करना संभव है

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

async function doStuff() { 
    //stuff... 
    var p = arguments.callee.promise; 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     p.resolve(result); 
    }); 
} 

या यहाँ तक कि:

async function doStuff() { 
    //stuff... 
    $.get('http://some/url/...', function(result) { 
     // stuff... 
     async.resolve(result); 
    }); 
} 

इस तरह

async function doStuff() { 
    //stuff... 
    var value = await new Promise(function(resolve) { 
     $.get('http://some/url/...', function(result) { 
      // stuff... 
      resolve(result); 
     }); 
    }); 
    return value; 
} 

क्या होगा यदि आप वादा समारोह के द्वारा बनाई गई करने के लिए एक सूचक मिल सकता है तो अपने कोड की तरह लग सकता है आपको सीधे प्रोमिस एपीआई तक पहुंचने की आवश्यकता नहीं है जो आपके कोड को बिना किसी अतिरिक्त काम पर केंद्रित करता है।

+1

मैं तुम्हें 'async' /' await' की बात को अनदेखा कर रहे हैं सोच रहा हूँ। क्या आप एक परिदृश्य तैयार कर सकते हैं जहां बस 'परिणाम = $ .get (someUrl) का इंतजार कर रहे हैं; doStuffWith (परिणाम) 'पर्याप्त नहीं है? प्रस्ताव का पूरा बिंदु कॉलबैक से निपटना नहीं है। – Amadan

+0

मैंने सोचा कि क्या आप पहले ही वादे में हैं कि आपको एक और बनाने की आवश्यकता क्यों है। नीचे बर्गि ने स्पष्ट रूप से जवाब दिया - संख्या =) – rokstar

उत्तर

11

वापसी कीवर्ड बिना async समारोह को हल करने क्या यह संभव है

सं

वहाँ वादा async function करने के लिए कॉल बनाया कि के लिए एक संदर्भ पाने के लिए कोई रास्ता नहीं है वहाँ वास्तव में है, लेकिन उस तक पहुंचने की कोई आवश्यकता नहीं है (और बीटीडब्ल्यू, आप .resolve() एक वादा नहीं कर सकते हैं, आपको वास्तव में वादे के हल करने वाले कार्यों तक पहुंच प्राप्त करने की आवश्यकता होगी)।

async/await का पूरा बिंदु वादे और अन्य उपनिवेशों के साथ अच्छा खेलना है। विचार यह है कि प्रत्येक असिंक्रोनस फ़ंक्शन एक वादा देता है, और आपको कुछ भी साबित करने की आवश्यकता नहीं है (लेकिन यदि आपको वास्तव में इसे अलग करना है) - और वास्तव में, $.get एक (jQuery) वादा वापस करता है । तो बस

async function doStuff() { 
    //stuff... 
    var result = await $.get('http://some/url/...'); 
    // stuff... 
    return value; 
} 

बारे में क्या तुम सच में एक कॉलबैक लेने समारोह है, तो का उपयोग एक साधारण

async function doStuff() { 
    // stuff… 
    return new Promise(function(resolve, reject) { 
     $.get({ 
      url: 'http://some/url/...', 
      success: resolve, 
      error: reject 
      // don't do other "stuff" in here 
     }); 
    }); 
} 
0

जब आप एक समारोह से एक वादा लौट रहे हैं के लिए समारोह async होने की कोई जरूरत नहीं है , वास्तव में यह भी बुरा है क्योंकि आप दो वादे बना रहे हैं!

function doStuff() { 
    return new Promise(function(resolve, reject) { 
     $.get('http://some/url/...', result => resolve(result)); 
    }); 
} 

async function main() { 
    const result = await doStuff(); 
} 
संबंधित मुद्दे

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