2017-01-13 13 views
6

यह कोई फर्क अगर मैं कर सकते हैं:जावास्क्रिप्ट: async समारोह के अंदर एक वादा लौटें

async function test() { 
    const foo = await bar() 
    return Promise.all([promise1, promise2]) 
} 
बजाय

:

async function test() { 
    const foo = await bar() 
    const [result1, result2] = await Promise.all([promise1, promise2]) 
    // Given that I don't care about result1, result2 in this `test` function 
    return [result1, result2] 
} 

मैं एक ही परिणाम प्राप्त अगर मैं या तो है। जैसे मैं किसी भी स्थिति के लिए ऐसा कर सकते हैं:

test().then(([result1, result2]) => { ... }) 

लेकिन मैं अंतर्निहित तंत्र कैसे वे दोनों एक ही तरह से व्यवहार के बारे में अधिक उत्सुक हूँ।

दूसरे शब्दों में, फ़ंक्शन के अंदर अगर एसिंक फ़ंक्शन इसे संभालता है तो मैं मूल्य के बजाय एक वादा वापस करता हूं?

उत्तर

0

मुझे लगता है कि आप एक सिंक्रोनस फ़ंक्शन (await वाला एक व्यक्ति इसे केवल एक फ़ंक्शन में बदल देता है जो वादे श्रृंखला में) देता है।

इस answer से

:

आप पूरी तरह से या अतुल्यकालिक कार्यों कि फिर एक नया वादा वापसी (तो फिर() संचालकों के भीतर से) वादा श्रृंखला के भीतर या तो तुल्यकालिक कार्यों कॉल करने के लिए स्वतंत्र हैं।

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

दूसरे मामले एक है जिसमें आप test().then(...) से एक तुल्यकालिक विधि है, जो वैध है बुला रहे हैं है।

+0

लिंक के लिए धन्यवाद! – BPm

2

दोनों कार्य Promise लौटाते हैं।

const [result1, result2] = await Promise.all([promise1, promise2]) 
//HERE 
return [result1, result2] 

जहां मैंने यहां लिखा था, आप परिणाम 1 और परिणाम 2 var तक पहुंच सकते हैं जो वादे के परिणाम हैं।

का इंतजार है एक वैकल्पिक Promise पर then कॉल करने के लिए है और आप

के खिलाफ इंतजार एक बेहतर विकल्प

var response1= await promise1 
var response2=await promise2 

उपयोग कर रहा है कई क्रमिक रूप से अनुरोध है, तो अपने प्रपत्र भी की तुलना में

Promise.all([promise1, promise2]).then(function(results){ 

}); 

अधिक पठनीय है

promise1.then(function(){ 
    promise2.then(function(){ 
     promise3.then(function(){ 
     }) 
    }) 
}) 

EDIT

पहले समारोह कीवर्ड async बेकार है में, कार्य परीक्षण एक वादा

दूसरा समारोह एक वादा, जिसमें आप कीवर्ड को देखने का इंतजार है वापस आ जाएगी वापस आ जाएगी। बहुप्रतीक्षित वादा समारोह के अंदर निष्पादन का समाधान होगा जब जारी रखने के लिए और आप वादा के परिणाम के लिए उपयोग कर सकते हैं

संपादित करें 1

MaybeI समझ में तुम क्या मतलब है, async कीवर्ड एक वादा के रूप में है कि में अपनी वापसी मूल्य संपुटित हल किया गया मूल्य जो आपने वापस कर दिया है

+0

हाँ, मुझे लगता है कि समझते हैं। हालांकि, अगर एसिंक हमेशा एक वादा करता है, तो इसका मतलब है कि यह वापस किए गए वादे को एक और वादे के अंदर लपेट देगा? – BPm

+0

Promise.all एक ही है कि वापस आ जाएगी है कि एक नया वादा बनाने के लिए, का इंतजार है बस समारोह के निष्पादन को रोक देगा जब तक वादा से मूल्य उपलब्ध है। –

+0

मुझे लगता है कि आपने मेरे प्रश्न को गलत समझा। मैं Promise.all के बारे में जानता हूं, और async फ़ंक्शंस का उपयोग कैसे करें। मेरा सवाल इस तरह है: पहले मामले के साथ, मैं एक मान वापस करता हूं जो एसिंक फ़ंक्शन को हल करेगा। दूसरे मामले के लिए, वास्तव में क्या होता है? – BPm

1

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

async function test(){ 
var duration = resolveAfter(500) 
    return new Promise((resolve, reject) =>{}) 
} 

var neverresolved = test() 

परिणाम neverresolved है एक वादा लंबित स्थिति में हमेशा है कि, उम्मीद के रूप में शामिल हैं।

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