2017-07-17 51 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一样甜美,承诺:-)干杯 –