有没有修复异步函数的方法[重复]

Posted

技术标签:

【中文标题】有没有修复异步函数的方法[重复]【英文标题】:Is there a method to fix async functions [duplicate] 【发布时间】:2019-10-20 09:10:00 【问题描述】:

最近我开始学习异步函数是 JS 所以我写了一个必须发出请求的代码,并使用它从请求中收到的数据,它应该写成 CSV,问题是写函数没有等待请​​求响应,所以它只是写了 undefined .

为了调试,我写了一个新代码来看看异步函数是如何工作的,所以我有下一个情况

我有 3 个函数 log1()、log2()、main()、 我期望:

当我调用main()时,它应该调用log1(),等到它完成所有语句,然后它应该调用log2()

所以我写了这段代码:

function slowFunction()
  setTimeout(() => 
    console.log('1')
  , 2000);

function log1() 
  return new Promise(resolve =>
    resolve(slowFunction())
  )

function log2() 
    console.log('2');


async function main() 
  var aux = await log1();
  log2();


main();

所以我希望它能够输出

1

2

但它确实输出了

2

1

我要注意我不能编辑 slowFunction,你应该认为它是一个需要未知时间来执行的函数,所以我需要等待它完成, 然后程序应该执行 log2();

【问题讨论】:

你的慢函数没有等待超时。 ***.com/questions/33289726/… 由于超时,我只是想模拟一个请求 该请求必须是承诺,因为它是异步的。 【参考方案1】:

问题在于slowFunction。看来您希望 slowFunction 在超时后解决,但它会立即返回,如当前所写。您需要重写slowFunction 以返回Promise,或者可能只是重写log1

function log1() 
    return new Promise((resolve) => 
        setTimeout(() => 
            console.log('1');
            resolve();
        , 2000);
    );

【讨论】:

其实我写timeout只是为了模拟一个请求,所以不能把resolve放在timeout里面【参考方案2】:

确保所有异步函数都用 promise 包装。

function slowFunction()
  return new Promise(resolve =>
    setTimeout(() => 
      resolve("1")
    , 2000);
  )


async function log1() 
  let ret = await slowFunction()
  console.log(ret)


function log2() 
  console.log('2');


async function main() 
  var aux = await log1();
  log2();


main();

【讨论】:

我不需要为解析超时使用超时我模拟了一个请求所以理论上我不能更改函数 1 或 2

以上是关于有没有修复异步函数的方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从构造函数调用的异步方法[重复]

在 C# 中的类构造函数中调用异步方法 [重复]

在循环中调用异步函数时避免重复创建函数

这在异步对象方法中[重复]

在异步函数内部,从回调函数返回值返回 Promise(undefined) [重复]

在异步函数内部,从回调函数返回值返回 Promise(undefined) [重复]