2017-02-27 15 views
10

मैं इस कोड के साथ टाइम त्रुटि संकलन हो रही है:Async/इंतजार अंदर सरणी # नक्शा()

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue); 
     } 
    }); 
}; 

त्रुटि संदेश है:

await is a reserved word

मैं इस तरह इसका इस्तेमाल क्यों नहीं कर सकते ?

मैं भी एक और तरीका कोशिश की, लेकिन यह मुझे एक ही त्रुटि देता है:

const someFunction = async (myArray) => { 
    return myArray.map(myValue => { 
     const myNewValue = await service.getByValue(myValue); 
     return { 
      id: "my_id", 
      myValue: myNewValue 
     } 
    }); 
}; 
+1

मुझे नहीं लगता कि आपके पास एसिंक तीर फ़ंक्शन हो सकते हैं। – Pointy

+0

प्रासंगिक https://github.com/tc39/ecmascript-asyncawait/issues/7 –

+1

लिंक किए गए जिथब चर्चा से सारांशित करने के लिए, आप ऐसा नहीं कर सकते क्योंकि गुमनाम फ़ंक्शन जिसे आप कॉलबैक के रूप में पास कर रहे हैं वह 'async' नहीं है और आंतरिक 'प्रतीक्षा' बाहरी कार्य को प्रभावित नहीं कर सकता है। –

उत्तर

20

आप ऐसा नहीं कर सकते के रूप में आप कल्पना क्योंकि आप await उपयोग नहीं कर सकते अगर यह सीधे एक async समारोह के अंदर नहीं है: हम शीर्ष स्तर के एक दिन का इंतजार है मिल सकता है।

यहां करने के लिए समझदार बात यह है कि समारोह को map असीमित करने के लिए किया जाएगा। इसका मतलब है कि map वादे की एक श्रृंखला वापस कर देगा। जब हम सभी वादे वापस आते हैं तो परिणाम प्राप्त करने के लिए हम Promise.all का उपयोग कर सकते हैं। Promise.all स्वयं एक वादा देता है, बाहरी फ़ंक्शन को async होने की आवश्यकता नहीं है।

const someFunction = (myArray) => { 
    const promises = myArray.map(async (myValue) => { 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
    return Promise.all(promises); 
} 
+0

इस मामले में वादे की सरणी धीमी नहीं है कि सरणी में सरणी के लिए क्लासिक? – stackdave

+0

@ स्टैकडेव शायद, लेकिन अंतर 'service.getByValue' के बगल में अपरिहार्य होगा, जिसमें नेटवर्क कॉल भी शामिल हो सकता है ... – lonesomeday

+0

धन्यवाद मैंने इसका उपयोग करना शुरू कर दिया है, वैसे भी पठनीयता वेग से बेहतर है, क्योंकि अधिकांश ES6 async तकनीक हमेशा धीमी हो जाएगी, लेकिन कौन परवाह करेगा – stackdave

4

मुझे विश्वास है कि क्योंकि map में समारोह async नहीं है तो आप नहीं हो सकता यह है में का इंतजार है, वापसी विवरण यह इस संशोधन के साथ संकलित:

const someFunction = async (myArray) => { 
    return myArray.map(async (myValue) => { // <-- note the `async` on this line 
     return { 
      id: "my_id", 
      myValue: await service.getByValue(myValue) 
     } 
    }); 
}; 

Try it out in Babel REPL

तो ... उसे अपने ऐप्लिकेशन के बाकी को देखने के लिए, लेकिन तुम क्या करने की कोशिश कर रहे हैं पर निर्भर करता है बिना सिफारिश देने के लिए, या तो भीतरी बनाने के लिए संभव नहीं है एसिंक्रोनस फ़ंक्शन करें या इस ब्लॉक के लिए कुछ अलग आर्किटेक्चर के साथ आने का प्रयास करें।

अपडेट:, https://github.com/MylesBorins/proposal-top-level-await

+0

धन्यवाद, अपवित्र, लेकिन खाली कोड के साथ आपका कोड रिटर्न सरणी (यानी '[{}, {}]')। मुझे लगता है कि मुझे कहीं भी 'प्रतीक्षा' शामिल करने की आवश्यकता है, लेकिन यह नहीं पता कि – MyTitle

+0

'service.getByValue' फ़ंक्शन कैसा दिखता है? – helb

+0

यह सिर्फ ईएस 6 वादा – MyTitle

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