如何结合await与setTimeout使用?解决getData函数返回null问题
问题根源
await 仅能等待Promise对象完成,但setTimeout返回的是一个数字类型的定时器ID,并非Promise。所以你的代码里await setTimeout(...)根本不会等待1.5秒,会直接执行后续的console.log(x)和return x,此时x还是初始的null。
正确实现方式
方式一:把setTimeout封装成Promise
将定时器逻辑包装进Promise,触发时通过resolve传递计算结果,让await能正确等待异步操作完成:
showData = (data) => { console.log("showing", data) } getData = async (a,b) => { const result = await new Promise((resolve) => { setTimeout(() => { resolve(a * b); }, 1500); }); console.log(result); // 1.5秒后输出200 return result; } // 调用async函数需处理其返回的Promise getData(10,20).then(data => { showData(data); // 1.5秒后输出showing 200 });
方式二:直接返回Promise(简化版)
如果getData里不需要额外同步操作,也可以直接返回Promise:
showData = (data) => { console.log("showing", data) } getData = (a,b) => { return new Promise((resolve) => { setTimeout(() => { resolve(a * b); }, 1500); }); } // 在async函数中用await接收结果 async function execute() { const x = await getData(10,20); console.log(x); // 200 showData(x); } execute();
注意点
async函数本身返回的是Promise,所以调用时要么用.then()链式处理结果,要么在另一个async函数内部用await接收。- 所有非Promise的异步API(比如setTimeout、setInterval),都需要先包装成Promise才能和async/await配合使用。
内容的提问来源于stack exchange,提问作者Devansh Chauhan
相关产品推荐
相关产品推荐

