处理0-n承诺的模式?

时间:2017-07-17 01:03:01

标签: javascript typescript design-patterns promise

我必须等待0-n的承诺。我目前检查我是否有0,1或更多的承诺,然后要么没有承诺,要么承诺或承诺Promise.All。

对我而言似乎很糟糕,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 个答案:

答案 0 :(得分:5)

  

我目前检查我是否有0,1或更多承诺,然后要么不承诺,要么承诺或承诺承诺。所有

整合到始终数组并使用Promise.all

e.g。

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

更多

基本上,如果您有0,1,n个值,请使用数组来合并类型,这就是数组的用途。