从javascript中的深层嵌套相关承诺返回调用者

时间:2020-06-13 02:45:27

标签: javascript es6-promise

我有常见的情况,但是没有回调方法,我找不到任何解决方案。这是我所拥有的: 从服务方法调用另一个文件中的帮助程序方法,从帮助程序调用执行一系列异步操作的辅助方法的方法。他们彼此依赖。

let myParentPromise = MyService.serviceFunc(in1, in2);
myParentPromise.then(res => console.log(res));
myParentPromise.catch(exc => console.log(exc));

服务层:

serviceFunc: (in1, in2) => {
  return new Promise((resolve, reject) => {
     //some processing
     let helperPromise = MyHelper.helperFunc(in1,in2);
      helperPromise.then(res => 
      //processing
      {resolve(res)});
      helperPromise.catch(exc => {reject(exc)})
  })

助手层:

helperFunc: (in1, in2) => {
return new Promise((resolve, reject) =>{
    resolve(async1);
  }).then(res1 =>{
    return async2;
  }).then(res2 => {
  return res2;

  })
}

我想将res2传递到我的服务层,然后传递到myParentPromise。

该怎么做? 是否可以在不使用回调的情况下做到这一点?我喜欢单纯地使用诺言来完成这项工作。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

我建议您看看文档here

如果您返回承诺,则可以链接。您已经返回了res2,为了能够在myParentPromise中获得该值,剩下的唯一内容是:

const finalResult = serviceFunc(in1, in2)
  .then(res => res)
  .catch(exc => exc);

const serviceFunc = (in1, in2) =>
  helperFunc(in1, in2)
    .then(res => res)
    .catch(exc => exc);

const helperFunc = (in1, in2) => async1.then(res1 => async2).then(res2 => res2);

最后,我建议您阅读有关async/await的信息,我认为这是对代码库的改进。

[编辑]更新了代码并添加了减少嵌套的示例。

因此,嵌套的问题是使异步代码晦涩难懂,可能错误地捕获错误,甚至更糟,可能会创建与第一个竞争的新的Promise链,对此进行了很好的解释here

因此,如何避免所有这些:如上例所示,返回promise。其他post很好地解释了为什么它是反模式以及如何解决它:)。

现在,如何减少嵌套?我可以想到两种方法:

  • 仅链式承诺在最高级别,这并不总是最简单,优雅和更好的代码,但似乎是可行的。您可以看到一个很好的示例here
  • 使用async/await

请始终记住您正在使用异步代码,并且作为经验法则,始终返回承诺。编码愉快!