2016-11-22 9 views
5

मैंने नहीं देखा है इन निर्माणों ज्यादा थे, लेकिन मैं अपने आप को उन्हें लिख async का उपयोग करना पाया है/कार्य में का इंतजार है कि आम तौर पर एक वादा वापस नहीं होगा, उदाहरण के लिएES8 तुरंत लागू async समारोह अभिव्यक्ति

chan.consume(queue, (msg) => { 
    this.pendingMsgs++; // executed immediately 
    (async() => { 
    await this.handleMessage(msg); 
    this.pendingMsgs--; 
    if (cancelled && this.pendingMsgs === 0) { 
     await chan.close(); 
     await this.amqpConnectionPool.release(conn); 
    } 
    })(); 
}); 

रूप

chan.consume(queue, async (msg) => { // external lib does not expect a return value from this callback 
    this.pendingMsgs++; // executed in promise context(?) 
    await this.handleMessage(msg); 
    this.pendingMsgs--; 
    if (cancelled && this.pendingMsgs === 0) { 
     await chan.close(); 
     await this.amqpConnectionPool.release(conn); 
    } 
}); 

या

chan.consume(queue, (msg) => { 
    this.pendingMsgs++; // no await - excess function decls & nesting 
    this.handleMessage(msg).then(() => { 
    this.pendingMsgs--; 
    if (cancelled && this.pendingMsgs === 0) { 
     chan.close().then(() => { 
     this.amqpConnectionPool.release(conn); 
     }); 
    } 
    }); 
}); 

करने का विरोध किया इस 'एक बात' है? क्या यहां समस्याएं हैं जिनके बारे में मुझे अवगत होना चाहिए? इस तरह की स्थितियों में एसिंक/प्रतीक्षा के उपयोग पर क्या कमी है?

+0

कर रही का फ़ायदा क्या है आप पुस्तकालय के लिए एक वादा लौटने से बचने के लिए चाहते हैं, एक सहायक समारोह है कि कॉलबैक लपेटता बनाने? – Pointy

+0

@ पॉइंट - क्या कुछ स्पष्ट विकल्प है जिसे मैंने अनदेखा किया है? –

+2

@DrewR एक फ़ंक्शन में वापसी जोड़ना जो वर्तमान में कुछ भी वापस नहीं करता है, किसी भी प्रतिस्थापन सिद्धांतों का उल्लंघन नहीं करता है। तो क्यों कार्य और इंडेंटेशन की एक और परत में सब कुछ लपेटने के साथ परेशान? –

उत्तर

4

क्या यह 'एक बात' है?

हां। यह हर समय और फिर आता है, उदा। here। उन्हें IIAFEs के रूप में जाना जाता है :-)
यदि आप तीर पर ध्यान केंद्रित करना चाहते हैं, तो आप उन्हें IIAAFs भी कॉल कर सकते हैं।

क्या यहां समस्याएं हैं जिनके बारे में मुझे अवगत होना चाहिए?

जब भी आप एक वादा-वापसी समारोह कहते हैं और परिणाम को कहीं और वापस नहीं लौटते हैं, तो आप अपने वादे के लिए ज़िम्मेदार होते हैं - जिसका अर्थ है कि आपको इससे त्रुटियों को संभालना होगा। तो पैटर्न सामान्य रूप से

(async() => { 
    … 
})().catch(err => { 
    console.error(err); 
}); 

यदि आप अनचाहे अस्वीकृति घटनाओं से खुद को चिंता नहीं करना चाहते हैं।

async/await के उपयोग पर इस तरह की स्थितियों में क्या कमी है?

then संस्करण की तुलना में बहुत अधिक नहीं है। हालांकि, आप कहते हैं कि "बाहरी lib इस कॉलबैक" से वापसी मूल्य की अपेक्षा नहीं करता है, जो लाइब्रेरी की असीमित कॉलबैक के साथ असंगतता पर संकेत दे सकता है, इसलिए सावधान रहें कि आप क्या कर रहे हैं। यह कॉलबैक से सिंक्रनाइज़ रूप से फेंकने वाले अपवादों पर भी निर्भर हो सकता है, इसलिए यह सब इस बात पर निर्भर करता है कि पुस्तकालय यहां क्या अपेक्षा करता है (और यदि कोई उम्मीद नहीं है, चाहे वह भविष्य में बदल सकता है)। लाइब्रेरी वादे वापसी मूल्यों का विशेष रूप से इलाज शुरू करने के मामले में आप भविष्य में असंगतताओं को नहीं चाहते हैं।

हालांकि, मैं अभी भी दूसरे पैटर्न की अनुशंसा करता हूं जो सीधे async फ़ंक्शन को सीधे बेहतर पठनीयता के कारण कॉलबैक के रूप में पास करता है।

function toVoid(fn) { 
    return (...args) => void fn(...args); 
} 
function promiseToVoid(fn) { 
    return (...args) => void fn(...args).catch(console.error); 
} 

जो आप इस तरह इस्तेमाल कर सकते हैं:

chan.consume(queue, toVoid(async (msg) => { 
    … // use `await` freely 
})); 
+0

मुझे रैपर फ़ंक्शन विचार पसंद है। धन्यवाद। –

+0

अनचाहे वादे के अस्वीकृति के बारे में नोट के लिए बहुत प्रशंसा - यह एक अच्छा जवाब है। Async जेब फ़ंक्शंस अब बहुत सारे दस्तावेज़ों में पॉप अप करना शुरू कर रहे हैं, और बहुत से लोग गैर-एसिंक फ़ंक्शन में डालने पर होने वाली त्रुटियों को अनदेखा कर रहे हैं। मैं यह भी कहूंगा कि यह '' प्रतीक्षा ') केवल तभी जरूरी है जब आप' प्रतीक्षा 'का उपयोग करके जेब फ़ंक्शन को कॉल न करें। यानी 'प्रतीक्षा करें (async() => {})(); '' catch() 'को जोड़ने के बिना ठीक है। लेकिन अगर आप 'प्रतीक्षा' छोड़ देते हैं, तो आपको अंत में '.catch() 'पर श्रृंखला को याद रखना होगा। – mikermcneil

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