2015-06-17 7 views
5

मैं कैसे awaitasync समारोह पर call या Babel साथ apply साथ कहा जाता है के साथ लागू होते हैं?कॉल या साथ नामक एक async समारोह पर प्रतीक्षा कोलाहल

class Service() { 
    async getOrders(arg1, arg2, arg3) { 
     return await this.anotherService.getOrders(arg1, arg2, arg3); 
    } 
} 

let service = new Service(); 
// ... 
// Babel doesn't compile 
// let stream = await service.getOrders.call(this, arg1, arg2, arg3); 
// producing SyntaxError: Unexpected token for await 
let stream = service.getOrders.call(this, arg1, arg2, arg3); 
stream.pipe(res); // obviously not working without await in the prev line 

अद्यतन/समाधान

समस्या यह है कि let stream = service.getOrders.call(this, arg1, arg2, arg3); एक नियमित रूप से समारोह के अंदर एक गुमनाम समारोह में गया था: जहां getOrders एक Service वर्ग का async विधि है

नीचे, एक उदाहरण है। अज्ञात फ़ंक्शन async को चिह्नित करने के बजाय, मैंने इसे नियमित फ़ंक्शन के लिए किया था जिससे बेबेल SyntaxError: Unexpected token उत्पन्न हुआ।

समाधान के लिए अग्रणी होने के लिए @loganfsmyth के लिए धन्यवाद।

+0

आप क्या करना है पूछ रहे हैं जब आप एक async समारोह कॉल करना चाहते हैं एक और async समारोह के बाहर? यह स्पष्ट नहीं है कि कॉल/आवेदन/बाध्य, या आपके प्रश्न में 'कॉल' के लिए आप क्या कर रहे हैं, इसके साथ क्या करना है। – loganfsmyth

+0

@loganfsmyth नहीं, मैं पूछ रहा हूं कि 'कॉल' या 'लागू'' नामक 'async' फ़ंक्शन' पर 'प्रतीक्षा' कैसे करें। – krl

+0

आप सामान्य रूप से जैसे ही इंतजार करेंगे। मेरा जवाब अपडेट किया गया। – loganfsmyth

उत्तर

4

एक async function एक वादा देता है, और await एक वादा स्वीकार करता है। इस बात की कोई आवश्यकता नहीं है कि सभी async कार्यों को प्रतीक्षा के माध्यम से बुलाया जाए। यदि आप मानक जेएस फ़ंक्शन के अंदर एसिंक फ़ंक्शन का उपयोग करना चाहते हैं, तो आप सीधे परिणाम वादे का उपयोग करेंगे। आपके मामले में, .call के साथ एक समारोह बुला अभी भी किसी अन्य समारोह की तरह एक वादा वापस आ जाएगी, तो आप वे का इंतजार करने के लिए उस वादे को दे देते हैं:

async function doThing(){ 
    let service = new Service(); 

    var stream = await service.getOrders.call(this, arg1, arg2, arg3) 
    stream.pipe(res); 
} 
+0

पर ले जाता है, यही वह है जो मैं अपेक्षा करता हूं, लेकिन' बेबेल 'वर्तमान में इसका समर्थन नहीं कर रहा है । – krl

+0

कृपया एक उदाहरण प्रदान करें जो इसे बेबेल में प्रदर्शित करता है, क्योंकि इसे निश्चित रूप से वहां भी काम करना चाहिए। आपका वर्तमान उदाहरण प्रतीक्षा का भी उपयोग नहीं करता है। – loganfsmyth

+0

क्योंकि 'babel' संकलित नहीं करता है' let stream = सेवा का इंतजार करें .getOrders.call (यह, arg1, arg2, arg3); '। 'सिंटेक्स त्रुटि' प्रदान करता है: 'प्रतीक्षा' के लिए अप्रत्याशित टोकन '। – krl

-3

आप इस प्रकार का आवरण की कोशिश कर सकते हैं:

class Service() { 
    async getOrders(arg1, arg2, arg3) { 
    // .... 
    }; 
    wrappedOrders(arg1, arg2, arg3) { 
     let res = await getOrders(arg1, arg2, arg3); 
     return res; 
    } 
} 

और wrappedOrders इस तरह से कहते हैं:

let stream = service.wrappedOrders.call(this, arg1, arg2, arg3); 
+1

'await' वाला प्रत्येक फ़ंक्शन 'async' है, इसलिए' wrappedOrders' को 'async' द्वारा भी होना चाहिए, जो हमें वापस मेरे प्रश्न – krl

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