如何将带回调的函数转为同步函数且不修改调用签名?求非while循环方案
解决方案
由于JavaScript的事件循环特性,无法在同步函数中同步获取异步操作的结果(阻塞式的while循环会导致线程卡死,属于不良实践)。结合你的需求(不能修改someFunc为async,但可以在调用f()时用await,且可任意修改f()内部),最优方案是用Promise封装f()的异步逻辑,再通过异步立即执行函数(IIFE)在someFunc内部处理结果。
修改后的代码实现
function f() { // 用Promise封装异步操作 return new Promise((resolve) => { setTimeout(() => { const data = { name: "bob" }; console.log("did some stuff"); // 异步完成后返回数据 resolve(data); }, 100); }); } function someFunc() { console.log('start'); // 在同步函数内部用async IIFE处理异步结果 (async () => { const data = await f(); console.log('end', data); })(); } someFunc();
执行逻辑说明
- 调用
someFunc()后,会立即打印start; - 内部的async IIFE启动,等待
f()返回的Promise完成; - 100ms后异步回调执行,打印
did some stuff并将数据通过resolve返回; - await拿到数据后,打印
end {name: "bob"}。
这种方式既避免了阻塞线程的糟糕实现,又满足了不修改someFunc为async函数的要求。
内容的提问来源于stack exchange,提问作者Adrian Black
相关产品推荐
相关产品推荐

