【问题标题】:async.js with async / await - need help explaining why this doesn't work带有 async / await 的 async.js - 需要帮助解释为什么这不起作用
【发布时间】:2021-03-15 02:53:05
【问题描述】:

我目前正在使用支持 ES2017 异步的 async.js v2.3.0。

我试图弄清楚为什么返回承诺的函数doSomething 在 IIEF 中有效,但 doSomething2 不被尊重。是因为doSoomething2 是一个异步函数,但并不完全运行“异步”代码吗?我觉得我在这里遗漏了一些东西。

function promiseTimeOut() {
 return new Promise((resolve, reject) => {
   setTimeout(() => {
     resolve(20);
   }, 1000);
 })
}

function doSomething() {
 return new Promise((resolve, reject) => {
   async.retry({
     times: 5,
     interval:(retryCount)=>{ return 50 * Math.pow(2, retryCount); }
   }, async () => {
     return await promiseTimeOut();
   }, (err, result) => {
     resolve(result);
   });
 })
}

async function doSomething2() {
 async.retry({
   times: 5,
   interval:(retryCount)=>{ return 50 * Math.pow(2, retryCount); }
 }, async () => {
   return await promiseTimeOut();
 }, (err, result) => {
   return result;
 });
}

// main function
(async () => {
 async.series([
   (callback) => {
     callback(null, 1);
   }, 
   async () => {
     return await doSomething();
   },
   async () => {
     // doesn't get waited on, returns undefined right away
     return await doSomething2();
   }
 ], (err, result) => {
   // result: 1, 20, undefined
   console.log(result);
 });
})()

【问题讨论】:

    标签: node.js async-await async.js


    【解决方案1】:

    您正在以回调样式编写 async.retry,这样它就不会等到它完成。试试console.log(result),可以看到

    [ 1, 20, undefined ]
    20
    

    查看retry的文档,以及其他方法,它引用了

    返回: 未提供回调时的承诺

    所以你只需要立即返回而不提供任何回调

    async function doSomething2() {
      return async.retry(
        {
          times: 5,
          interval: (retryCount) => {
            return 50 * Math.pow(2, retryCount)
          },
        },
        async () => {
          return await promiseTimeOut()
        }
      )
    }
    

    【讨论】:

    • 这很好。 Async.js v2.3.0 仍然只支持回调,所以我怀疑我必须将它包装在一个承诺中才能让它工作。但是,在 Async.js v3+ 中,如果没有给出回调,则会返回一个 Promise。谢谢。
    【解决方案2】:

    Async.js 正在对您的代码执行反编译以适应其行为,具体取决于您使用的是异步函数(返回承诺)还是基于回调的函数。这就是为什么你可以看到不同的行为,它仅仅取决于在你的函数前面是否有一个“async”关键字的简单事实(即使行为应该是相同的)。

    坦率地说,这不是一个好主意。 Async.js 在它所做的事情上并不差,但显然它是一个为简化回调的使用而构建的库,后来升级为尝试使用 Promise。不幸的是,这种基于反编译的自动魔术行为可能并且将会导致问题。例如,它可以使代码的行为完全不同,具体取决于您是否使用像 Babel 这样的预编译器。

    我最近发布了一个库,它是 async.js 的替代品,并且恰好只使用 Promises(和 async/await),从而使一个完全一致的库可以使用这些较新的工具工作。

    结果被命名为modern-async并且在这里:https://nicolas-van.github.io/modern-async/

    【讨论】:

      猜你喜欢
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多