javascript对于异步函数,如何让异步函数不阻塞,直接执行函数后面的功能

在 JavaScript 中,异步函数通常会通过 async/await 或 Promise 处理。默认情况下,异步函数会导致后续代码等待其执行完成(即阻塞),但你可以通过不同的方法让异步函数不阻塞后续代码,直接执行函数后面的逻辑。

方法一:使用 Promise(不使用 await

如果你不希望异步函数阻塞后续代码,可以不使用 await,直接调用异步函数并处理其返回的 Promise

示例:
function asyncFunction() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('异步任务完成');
      resolve();
    }, 2000);
  });
}

function main() {
  console.log('开始异步任务');
  asyncFunction();  // 异步任务不阻塞后续代码
  console.log('异步任务已调用,继续执行后续代码');
}

main();
解释:
  • asyncFunction() 返回一个 Promise,但我们没有使用 await,因此不会阻塞后续代码的执行。
  • 输出结果:
开始异步任务
异步任务已调用,继续执行后续代码
异步任务完成

方法二:使用 setTimeout 或 setImmediate

有时你希望在事件队列中执行一些操作而不立即执行,可以使用 setTimeout 或 setImmediate。这会将某些任务推迟到当前执行栈清空之后执行。

示例:
function asyncFunction() {
  setTimeout(() => {
    console.log('异步任务完成');
  }, 2000);
}

function main() {
  console.log('开始异步任务');
  asyncFunction();  // 异步任务不会阻塞后续代码
  console.log('异步任务已调用,继续执行后续代码');
}

main();
解释:
  • setTimeout 将 asyncFunction 中的代码推迟到事件循环队列中执行,因此异步任务不会阻塞后续代码。
  • 输出结果:
开始异步任务
异步任务已调用,继续执行后续代码
异步任务完成

方法三:使用 async/await 但不阻塞主流程

如果你需要在异步函数中使用 await,但又不想阻塞后续代码,你可以使用 Promise 包装 async/await 调用,并通过 then 来处理后续的逻辑。

示例:
async function asyncFunction() {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('异步任务完成');
      resolve();
    }, 2000);
  });
}

function main() {
  console.log('开始异步任务');
  asyncFunction().then(() => {
    console.log('异步任务完成后的操作');
  });
  console.log('异步任务已调用,继续执行后续代码');
}

main();
解释:
asyncFunction() 返回 Promise,我们在主函数 main() 中通过 then 来处理异步操作完成后的逻辑。
输出结果:
开始异步任务
异步任务已调用,继续执行后续代码
异步任务完成
异步任务完成后的操作

总结:

  1. Promise 如果不希望阻塞,可以直接调用异步函数,返回的 Promise 会被自动处理,后续代码继续执行。
  2. setTimeout/setImmediate 将异步任务延迟到事件循环的下一次执行,从而避免阻塞主线程。
  3. async/await 配合 then 使用 await 时通常会阻塞,但可以通过 then 处理来避免阻塞后续代码的执行。

通过这些方法,你可以让异步函数在执行时不阻塞主程序的逻辑,保证代码的并行执行和流畅性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孽小倩

非常荣幸能帮助到你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值