You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用async函数并等待其执行,使控制台先输出'1'?

解决async函数中await无效导致执行顺序错误的问题

嘿,我来帮你搞定这个控制台打印顺序的问题~先看看你的问题场景:

我希望控制台先打印'1',但不确定如何调用async函数并等待其执行后再执行下一行代码。代码示例如下:

const request = require("request");
async function getHtml() {
  await request("https://google.com/", function (error, response, body) {
    console.log("1");
  });
}
getHtml();
console.log("2");

当前得到的输出结果为2 1。

问题出在哪?

核心原因是**request是基于回调的函数,不是Promise风格的**——await只能等待返回Promise对象的操作,而request执行后返回的是一个请求实例,不是Promise。所以你的await根本没起到“等待”的作用,getHtml函数会直接执行完,接着就跑console.log("2"),等请求回调触发时才打印1,自然顺序反了。

两种解决方案,任你选:

方案1:手动把request包装成Promise

我们可以自己写个小函数,把回调式的request转换成Promise,这样就能用await等待它完成了:

const request = require("request");

// 包装request为Promise函数
function requestPromise(url) {
  return new Promise((resolve, reject) => {
    request(url, (error, response, body) => {
      if (error) {
        reject(error); // 请求失败时抛出错误
      } else {
        console.log("1");
        resolve({ response, body }); // 请求成功时返回结果
      }
    });
  });
}

async function getHtml() {
  await requestPromise("https://google.com/");
}

// 注意:调用async函数时,要等待它完成才能执行后续代码
// 这里用自执行async函数来实现
(async () => {
  await getHtml();
  console.log("2");
})();

方案2:改用支持Promise的request库

如果不想自己写包装函数,可以直接用request-promise(需要先通过npm install request-promise安装),它是request的官方Promise化版本,直接就能配合await使用:

const rp = require("request-promise");

async function getHtml() {
  await rp("https://google.com/");
  console.log("1");
}

// 同样用自执行async函数来保证顺序
(async () => {
  await getHtml();
  console.log("2");
})();

关键提醒:

调用async函数的时候,不能直接getHtml()就结束——因为async函数本身返回的是Promise,必须用await或者.then()来等待它完成,否则后续代码还是会先执行。比如上面的自执行async函数,就是把getHtml()和console.log("2")放在同一个异步上下文里,确保顺序正确。

内容的提问来源于stack exchange,提问作者chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:59