2015-11-13 41 views
23

ile Promise.All nasıl kullanılır Burada yapmak istediğim şeydir.typescript

Derleyici, türün kullanımdan çıkarılamayacağı konusunda bir hata iletisi verir. Ben başarmak için çalışıyorum ne

ikisi de çok uzun süreçler olarak, daha sonra, bunları aynı anda çalışmasına olsun Bu tutanak ve Promise.all imzasında bir zayıflık Aurelia.setRoot();

cevap

27

çalıştırmaktır. Tutarlı tipte dizilere sahip olmak genellikle en iyisidir. Promise::all yana

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

En mükemmel! –

+0

Visual Studio Kodu, sözdizimi, ancak yapı sistemimde bulunan '' tslint'' ifadesinin şunları doğruladığını onaylıyor: '' 'dizi doğru olarak bildirilmiyor, Type [] ya da Array ' '' olmalıdır. Garip bir şekilde, bu hata mesajının aranması tam olarak ** 0 ** sonuç verir. –

+1

bu yüzden yazalım: diyelim: Array , Promise > = [aurelia.start(), entityManagerProvider.initialize()]; ' –

6

genel fonksiyonudur, sen devam böyle zamanın türlerini bildirebilirsiniz: Gerçi şu elle yapabilirsiniz

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

vscode mükemmel çalışır. ama bir şekilde tsc ile derlediğimde hata diyor ki "hata TS2346: Verilen parametreler herhangi bir çağrı hedef imzasıyla eşleşmiyor." (tsc -v 2.0.6). Herhangi bir çözüm? – DevTrong

+0

Bu verim * "Sağlanan parametreler, arama hedefinin imzasıyla eşleşmiyor." * 2.1.4 de. –

+0

Hrm, neden emin değilim. Benim için çalışıyor. –

5

IMHO, cari cevap ciddi kullanım için yetersiz Sözün çözüldüğü zaman için tip kontrolünü etkin bir şekilde devre dışı bıraktığı için.

daha iyi bir yaklaşım Promise.allolmayan-mutlaka arası atanabilir değerleri sonlu sayıda çağrıldığında için ek yük imzalarla (tip PromiseConstructor arasında) Promise nesnenin doğal tip tanımı uzanan bir his :

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]>; 
    ... 
} 

İstediğiniz kadar fazla aşırı yükleme ekleyin. Bu yaklaşım onfulfilled geri arama value argüman tüm öğeler için tam tip güvenlik sağlar:

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

Bence bu zarif bir çözüm. –

+0

Şimdiye kadar kaç tane çocuğa sahip olacağınızı bilmediğinizde çok iyi ölçeklenmiyor – blockhead

+0

(Blockhead) Eğer yaklaşık 3-5'den daha fazlasına ihtiyacınız varsa, yine de tek bir nesneyi almak için yeniden yapılandırmadan daha iyi olursunuz. Bu, yalnızca dikkate alınması gereken _some_ değerlerine sahip olduğunuz durumlar içindir. –