【问题标题】:A pattern to handle 0-n promises?处理 0-n 承诺的模式?
【发布时间】:2017-07-17 01:03:00
【问题描述】:

我必须等待 0-n 个承诺。我目前检查我是否有 0、1 或更多的 Promise,然后调用 no Promise、一个 Promise 或 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); });
  }
}

是否有更好的模式来处理动态数量的承诺?

【问题讨论】:

  • 好吧,Promise.all 也适用于空的和单元素的 Promise 数组,那么为什么不在每种情况下都使用它呢?
  • 哦,我被文档弄糊涂了,它至少需要两个参数。很酷,它与具有 0,1,n 承诺的数组一样有效:-)
  • 您阅读了哪些文档?它只有一个参数 - iterable。
  • 智能感知,自动补全

标签: javascript typescript design-patterns promise


【解决方案1】:

我目前检查我是否有 0 个、1 个或多个 Promise,然后调用 no Promise、一个 Promise 或 Promise.All

合并成一个always数组并使用Promise.all

例如

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

更多

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

【讨论】:

  • 干杯,我对至少有两个承诺的参数列表感到困惑。它与 0,1,n 承诺一样有效:-) 干杯
猜你喜欢
  • 1970-01-01
  • 2018-02-13
  • 2022-01-22
  • 1970-01-01
  • 2018-11-18
  • 2017-12-20
  • 2018-03-11
  • 2013-11-16
  • 1970-01-01
相关资源
最近更新 更多