如何调用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
相关产品推荐
相关产品推荐

