【问题标题】:async function nested inside a function嵌套在函数内的异步函数
【发布时间】:2021-02-04 11:52:19
【问题描述】:

我正在使用一个框架,我在其中找到了这样的代码:

区块1

fun_1(params, callback) { 
        fun_2(params, callback) {
                ...     
                     fun_n(params, callback) {
                          asyncFunction().then(callback).catch(callback)
                                }

因为asyncFunction 来自已弃用的npm package,我会借此机会重构它。 我想换成这样的:

block2

fun_1(params).then(callback)

fun_1 的位置:

fun_1(params) {
    fun_2(params) {
          return asyncFunc()     ???
  }
}   

第二种模式是否正确且优于第一种模式?

【问题讨论】:

  • 这是在前端还是在 Node 中?
  • 我只是在学习 Async 函数,但你应该使用 Promise 吗?喜欢return new Promisse(resolve=>{ . . .
  • 这是在 node @CertainPerformance 上,我想 asyncFunction 返回一个 Promise 是的
  • @LuísHNrique 当你使用异步时,你应该停止直接处理 Promises,否则你会创建丑陋的代码。 async 是隐藏 Promises 的抽象。
  • 这不是语法上有效的代码,所以我们不确定您在这里处理的是什么。一般来说,您可能想关注我的rules of thumb for working with promises

标签: javascript asynchronous promise callback nested-function


【解决方案1】:

这似乎是正确的。但是,所有函数在调用内部函数时都需要返回该承诺。例如:

fun_1(params) {
  fun_2(params) {
    return asyncFunc();
  }

  return fun_2(params);
} 

fun_1(params).then(callback);

【讨论】:

  • 谢谢@Gazihan Alankus! block2 是最佳实践还是 block1 有任何优势。 block1 使代码的可读性降低,不知道会发生什么我无法读取线性代码,但需要打开所有嵌套函数的代码(有时分散在一些不同的文件中)。它是否加快了从fun_nfun_1 的返回速度,在fun_n 中立即调用回调?
  • 如果在返回之前从fun_n 调用它会提高速度,那将是微不足道的。我认为不要到处乱扔带有回调参数的代码是一个好方法。此外,如果函数名称表明它们正在启动某些东西,调用者可以确定它正在返回一个承诺并自行准备。
【解决方案2】:

您的问题中没有太多信息,但我会尽力回答。

为了使fun_1 能够与.then 链接,它需要返回一个promise:

function fun_1() {
   return new Promise((resolve, reject) => {
      // Do some tasks and resolve when complete
      resolve(/* some data */)
   }
}

或者,使用 async 关键字,它只是 Promise 的语法糖:

async function fun_1() {
    await some_async_task()
    return; // does the same as resolve would in Promise
}

为了重构代码,您将不得不在 Promise 中移动异步内容和回调。 如果您想澄清问题中的某些内容以获得更好的答案,请告诉我。

【讨论】:

  • 嗨@Jacob,谢谢。 fun_1 在其他一些函数之后调用 asyncFunctionasyncFunction 不是已经返回了 promise 吗?我想知道的是我是否应该从fun_1 返回一些Promise,或者它已经由asyncFunction 完成。如果 block2 是最佳实践。
  • 我不明白 fun_2 在哪里被调用。 fun_1 应该返回 fun_2 的结果吗?如果 asyncFunction 返回一个 Promise,你可以直接返回它。
猜你喜欢
  • 2012-10-12
  • 2014-10-05
  • 2019-10-02
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多