【问题标题】:How to avoid logic duplication when promisifying js methods?承诺js方法时如何避免逻辑重复?
【发布时间】:2016-12-07 16:03:18
【问题描述】:

最近我接受了 Promise 链接模式。这样做非常方便:

action1
.then(()=> action2())
.then(()=> action3());

但是,为了做到这一点,我改变了我的所有方法(TypeScript):

action1() : Promise<any>{
  try{
     // actual code
     return Promise.resolve();
  } catch (err){
     console.error(err);
     return Promise.reject(err);
  }
}

这看起来像是非常重复的模式。避免代码重复的最佳方法是什么?

【问题讨论】:

  • 这几乎没有任何意义。当你的//actual code 是同步的时,你为什么要使用 Promise?
  • @Bergi,对。但我还是想把它锁起来
  • 简单地使用action3(action2(action1())) 链接同步函数?或者使用函数组合。你绝对不应该对同步代码使用 Promise。

标签: javascript typescript promise method-chaining


【解决方案1】:

编写一个函数来包装一个函数的promise,你可以重用它

wrapPromise(fun) : Promise<any>{
  try{
     var value = fun()
     return Promise.resolve(value);
  } catch (err){
     console.error(err);
     return Promise.reject(err);
  }
}


wrapPromise(action1).then()

【讨论】:

  • 是的,没错。但人们真的会这样做吗?最佳做法是什么。
  • @PavelEvdokimov 最好的做法是不要对同步代码使用承诺……
【解决方案2】:

由于您使用的是打字稿,因此您需要使用async/await。干脆做

async action1(): Promise<any>{
  try {
     return // actual code;
  } catch (err){
     console.error(err);
     throw err;
  }
}

但是很有可能您实际上不想在每个函数中捕获、记录和重新抛出所有错误,因此这简化为

async action1(): Promise<any>{
  return // actual code;
}

【讨论】:

  • 链接网站说 1.7。
  • @Bergi 仅当你的目标是 ES6。
  • 啊,好的。我猜你可以定位 ES6,然后通过标准转译器将结果传递给你需要的任何东西。
猜你喜欢
  • 2021-11-27
  • 2020-08-12
  • 2010-10-13
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2018-10-20
相关资源
最近更新 更多