如何让变量等待轮询函数完成再赋值(ES6 Promise)
搞定异步轮询的结果等待赋值问题
嘿,我懂你遇上的麻烦了——PollServer.getData(id)是个异步轮询操作,要跑个10秒左右,你希望变量要么等到它返回数组,要么等够30秒超时再赋值,但直接var response = PollServer.getData(id)只会立刻拿到个Promise对象,错误用fetch包它更是完全不对(fetch是发HTTP请求用的,不是处理自定义异步函数的)。
下面给你两种实用的解决办法,保证变量乖乖等结果:
方法一:用async/await + 超时封装
先整个带超时的工具函数,再用async函数把等待逻辑理顺:
// 封装一个支持超时的Promise工具 function withTimeout(promise, timeoutMs) { return Promise.race([ promise, new Promise((_, reject) => setTimeout(() => reject(new Error('轮询超时啦')), timeoutMs) ) ]); } // 处理轮询的async函数 async function fetchPollData(id) { try { // 这里会一直等,直到拿到结果或者超时 const response = await withTimeout(PollServer.getData(id), 30000); // response就是你要的数组结果啦 return response; } catch (err) { console.error('轮询出问题了:', err); // 超时或出错时可以返回空数组之类的默认值,也可以直接抛错 return []; } } // 用的时候注意:await只能在async函数里用哦 const myPollData = await fetchPollData(你的ID);
方法二:纯Promise链式调用(不用async/await)
要是你不想用async/await,直接用Promise的链式写法也能搞定:
function fetchPollData(id) { // 先整个超时的Promise const timeoutPromise = new Promise((_, reject) => { setTimeout(() => reject(new Error('轮询超时')), 30000); }); return Promise.race([ PollServer.getData(id), timeoutPromise ]) .then(response => { // 成功拿到数组,直接返回 return response; }) .catch(err => { console.error('轮询失败:', err); // 出错时返回默认值 return []; }); } // 使用示例 fetchPollData(你的ID).then(myPollData => { // 这里的myPollData就是等出来的结果 console.log('拿到轮询数据:', myPollData); });
划重点
- Promise.race是核心:它会盯着第一个完成的Promise(不管成功失败),完美实现“要么拿结果,要么等超时”的需求。
- 别乱⽤fetch:fetch的参数是URL字符串,不是异步函数调用,之前的写法完全错了,别再那么用啦。
- 异步结果不能同步拿:异步操作的结果只能在
await之后或者then回调里拿到,同步赋值永远拿不到最终的数组,这是异步编程的基本逻辑哦。
内容的提问来源于stack exchange,提问作者t56k
相关产品推荐
相关产品推荐

