2017-07-17 54 views
0

我必須等待0-n個承諾。我目前正在檢查是否有0個,1個或更多的承諾,然後再打電話沒有承諾,一個承諾或Promise.All。處理0-n承諾的模式?

對我來說,這看起來很差,return this._createItemAndReloadItems(logItem)部分重複三次。有沒有更好的模式來實現這一目標?

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

Well'Promise.all'很好地適用於承諾的空元素和單元素數組,所以爲什麼不在任何情況下都使用它呢? – Bergi

+0

哦,我對文檔感到困惑,至少需要兩個參數。酷,它作爲一個陣列與0,1,甜蜜的承諾:-) –

+0

你讀過哪些文檔?它只有一個參數 - 可迭代的。 – Bergi

回答

5

目前,我檢查,如果我有0,1或更多的承諾,然後呼叫沒有答應,一個承諾或Promise.All

合併成一個總是數組,並使用Promise.all

例如

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

更多

基本上當你有0,1,n值,使用數組來鞏固類型,這是一個數組是什麼。

+1

乾杯,我很困惑的參數列表至少有兩個承諾。它和0,1一樣甜美,承諾:-)乾杯 –