2017-10-06 5 views
0

私は配列内のデータの可変数を持っています。プロミス関数をダイナミックな長さで連結するにはどうしたらいいですか?

function tryThis(num: number): Promise<any> { 
    return new Promise ((resolve, reject) => { 
    if(num == 3){ 
     resolve() 
    }else{ 
     reject(); 
    } 
    } 
} 

let arrayOfSomething : Array<number> = [1,2,3,4]; 
let chain; 

// create the chain 
arrayOfSomething.forEach((element) => { 
    // add element to the chain 
    chain.catch(() => { 
     tryThis(element); 
    }); 
}); 


// run chain 
chain 
    .then(() => { 
    // one of elemnts of the array was 3 
    }) 
    .catch(() => { 
    // no "3" found in array 
    }) 

だから、私の目標はtryThis()関数のすべてが拒否与えた場合のデータの変数countで、エンドキャッチでアレイを形成約束チェーンを作成することです:私はこれを行うには何かを、したいです。 tryThis()関数の1つがチェーン内でresolveを返すと、最後にジャンプしてresolveで終了します。

私のコードは正しくありませんが、これは私がしたいことを示すことに過ぎません。

誰でも私に手伝ってもらえますか?

ありがとうございます!

+0

あなたはこのために約束を使いたいのはなぜ? 'tryThis'は非同期関数ではありません。 – alexmac

+0

tryThis()は単なる例であるためです。私は後で私たちの非同期関数 の代わりにtryThis()を使用します。 – Scriba

答えて

1

MaybeeあなたはブルーバードのPromise.any、または他のライブラリと同様の機能を利用することができます:https://www.npmjs.com/package/promise.anyまたはhttps://www.npmjs.com/package/promise-any

Promise.anyすべての要素が拒否されると拒否されます。だから、番号の配列から約束の配列を作成し、Promise.anyを呼び出す必要があります。例えばだから:。

let arrayOfSomething = [1,2,3,4]; 
Promise.any(arrayOfSomething.map(x => tryThis(x)) 
    .then(() => { 
    // one of elemnts of the array was 3 
    }) 
    .catch(() => { 
    // no "3" found in array 
    }) 
+0

このソリューションでは、tryThis()関数のパラレルを実行していますか?これは私には良いことではないからです。簡単な約束のように、すべての機能を直列に実行することは重要です。 私はこの解決策を試してみますが、私にとってはうまくいかないようです。 – Scriba

0

だから、私の目標はtryThis()関数のすべてが拒否与えた場合のデータの変数countで、エンドキャッチでアレイを形成約束チェーンを作成することですtryThis()関数の1つがチェーン内でresolveを返すと、最後にジャンプしてresolveで終了します。 asyncawait

function tryThis(num: number) { 
    return new Promise<void>((resolve, reject) => { 
    if (num === 3) { 
     resolve() 
    } else { 
     reject() 
    } 
    }) 
} 

async function makeChain(arrayOfSomething: number[]): Promise<void> { 
    for (let num of arrayOfSomething) { 
    try { 
     await tryThis(num) // Call 'tryThis' sequentially 
     return    // The promise is resolved? Resolve the chain. 
    } catch (err) {  // The promise is rejected? Continue. 
    } 
    } 
    throw new Error("All the promises has been rejected") // Reject the chain. 
} 

let chain = makeChain([1, 2, 3, 4]) // 'chain' contains the promise 
関連する問題