2015-11-13 36 views
23

साथ Promise.All का उपयोग कैसे करें यहाँ मैं क्या करना चाहते हैं।टाइपप्रति

संकलक है कि प्रकार के उपयोग से नहीं लगाया जा सकता एक त्रुटि संदेश देता है।

मैं क्या हासिल करने की कोशिश कर रहा हूँ उन्हें एक ही समय में चलाने के लिए, है, तो प्राप्त करने के लिए के रूप में वे दोनों बहुत लंबे प्रक्रियाएं हैं चलाने Aurelia.setRoot();

उत्तर

27

यह टाइपप्रति और उसके Promise.all हस्ताक्षर में एक कमजोरी है। यह आमतौर पर लगातार प्रकार के साथ सरणी है।

let foo : [Promise<Aurelia>,Promise<void>] = [aurelia.start(), entityManagerProvider.initialize()]; 
Promise.all(foo).then((results:any[]) => { 
    let aurelia: any = results[0]; 
    aurelia.setRoot(); 
}); 
+0

सबसे उत्कृष्ट! –

+0

दृश्य स्टूडियो कोड को मंजूरी दी है कि वाक्य रचना लेकिन '' 'tslint''' अपने निर्माण प्रणाली में बंडल शिकायत:' '' सरणी सही ढंग से घोषित नहीं किया गया है यह होना चाहिए प्रकार [] या सरणी '' '। आश्चर्यजनक रूप से, उस त्रुटि संदेश की खोज वास्तव में ** 0 ** परिणाम पैदा करती है। –

+1

इसलिए लिखें 'लू फू: ऐरे <वादा , वादा > = [aurelia.start(), entityManagerProvider.initialize()]; –

6

Promise::all के बाद से एक सामान्य समारोह है, तो आप प्रकार इस तरह समय से आगे की घोषणा कर सकते हैं: आपको निम्न मैन्युअल हालांकि कर सकते हैं

Promise.all<Aurelia, void>([ 
    aurelia.start(), 
    entityManagerProvider.initialize() 
]) 
.then(([aurelia]) => aurelia.setRoot()); 
+1

vscode में यह पूरी तरह काम करता है: उत्तर देखें। लेकिन किसी भी तरह जब मैं इसे टीएससी के माध्यम से संकलित करता हूं तो यह कहता है कि 'त्रुटि टीएस 2346: आपूर्ति पैरामीटर कॉल लक्ष्य के किसी भी हस्ताक्षर से मेल नहीं खाते हैं।' (tsc -v 2.0.6)। कोई समाधान? – DevTrong

+0

यह पैदावार * साथ ही 2.1.4 में "आपूर्ति मापदंडों कॉल लक्ष्य के किसी भी हस्ताक्षर से मेल नहीं है।" *। –

+0

एचआरएम, मुझे यकीन नहीं है क्यों। इससे मेरा काम बनता है। –

5

IMHO, वर्तमान जवाब गंभीर उपयोग के लिए अपर्याप्त है , क्योंकि यह वादा को हल करने के लिए प्रभावी रूप से टाइप-चेकिंग अक्षम करता है।

मुझे लगता है एक बेहतर दृष्टिकोण जब Promise.allनहीं-जरूरी अंतर-आबंटित मूल्यों की एक सीमित संख्या के साथ कहा जाता है के लिए Promise अतिरिक्त अधिभार हस्ताक्षरों के साथ (प्रकार PromiseConstructor का) वस्तु की मूल प्रकार परिभाषा का विस्तार है :

interface PromiseConstructor 
{ 
    all<T1, T2>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>]): Promise<[T1, T2]>; 
    all<T1, T2, T3>(values: [T1 | PromiseLike<T1>, T2 | PromiseLike<T2>, T3 | PromiseLike<T3>]): Promise<[T1, T2, T3]>; 
    ... 
} 

आपको जितनी जरूरत हो उतनी ओवरलोड लोड करें। यह दृष्टिकोण onfulfilled कॉलबैक की value बहस में सभी तत्वों के लिए पूर्ण प्रकार सुरक्षा प्रदान करता है:

Promise.all([1, "string", true]).then(value => { 
    var a: number = value[0]; // OK 
    var b: number = value[1]; // Type 'string' is not assignable to type 'number'. 
    ... 
}); 
+0

मुझे लगता है कि यह एक सुरुचिपूर्ण समाधान है। –

+0

बहुत अच्छी तरह से स्केल नहीं करता है जब आप नहीं जानते कि कितने आप पहले – blockhead

+0

@blockhead में होगा आप की जरूरत के बारे में 3-5 की तुलना में अधिक आप एक ही वस्तु वैसे भी प्राप्त करने के लिए बेहतर पुनर्गठन कर रहे हैं। यह उन मामलों के लिए ठीक है जहां आपके पास विचार करने के लिए केवल _some_ मान हैं। –