2017-07-17 6 views
0

私は0-n約束を待たなければなりません。私は現在、私が0、1、またはそれ以上の約束を持っているかどうかを確認してから、約束、約束または約束を呼んではいけません。0-n約束を扱うパターン?

return this._createItemAndReloadItems(logItem)部分が3回繰り返されているように私には貧弱なスタイルのようです。これを達成するためのより良いパターンがありますか?

public createItem(logItem: IInteractionLogItem): Promise<IInteractionLogItem[]> { 
    const userPromises: Promise<{}>[] = []; 

    if(logItem.Client && logItem.Client.AccountName){ 
    userPromises.push(this._ensureUser(logItem.Client)); 
    } 

    if(logItem.AssignedTo && logItem.AssignedTo.AccountName){ 
    userPromises.push(this._ensureUser(logItem.AssignedTo)); 
    } 

    if(logItem.ResolvedBy && logItem.ResolvedBy.AccountName){ 
    userPromises.push(this._ensureUser(logItem.ResolvedBy)); 
    } 

    if(logItem.Referrer && logItem.Referrer.AccountName){ 
    userPromises.push(this._ensureUser(logItem.Referrer)); 
    } 

    console.log("SharePointDataProvider.CreateItem: userPromises.length=" + userPromises.length); 

    if(userPromises.length == 0) 
    { 
    return this._createItemAndReloadItems(logItem); 
    } 
    else if(userPromises.length == 1) 
    { 
    return userPromises[0].then((value: {}) => { return this._createItemAndReloadItems(logItem); }); 
    } 
    else 
    { 
    return Promise.all(userPromises).then((value: {}[]) => { return this._createItemAndReloadItems(logItem); }); 
    } 
} 

約束の動的量に対処するパターンはありますか?

+1

よく 'Promise.all'は、空の配列と単一要素の配列の配列でもうまく動作しますので、どのような場合にも使用してみてください。 – Bergi

+0

私はドキュメンテーションに混乱しました。少なくとも2つのパラメータが必要でした。 0,1、n約束で配列と同じように甘く動作します:-) –

+0

どのドキュメントをお読みになりましたか?それは1つのパラメータだけを持っています - 繰り返し可能です。 – Bergi

答えて

5

私は現在、私は0、1またはそれ以上の約束を持っているかどうかを確認し、その後のいずれか全く約束を呼び出していない、1つの約束またはPromise.All

常に配列に統合して使用Promise.all

Promise.all([]) // 0 
Promise.all([one]) // 1 
Promise.all([one,two,three]) // n 

もっと

基本的にあなたが0,1,n値を持っている場合、配列が何のためにあるのかである、種類を統合するために、配列を使用しています。

+1

乾杯、私は少なくとも2つの約束を持つパラメータリストに混乱していました。それは0,1とnが約束したように甘く働いた:-)乾杯 –