如何在API请求的回调函数外部访问其内部赋值的变量?
异步回调变量访问问题解决方案
问题本质
这是典型的JavaScript异步执行时序问题:finnhubClient.quote 属于异步网络请求API,你传入的回调函数会在网络请求完成后才触发执行;而回调外的console.log(currentPrice) 会在调用quote方法后立刻运行,此时回调还未执行,currentPrice 还没被赋值,所以拿到的是初始的undefined。
解决方法
方案1:逻辑移入回调内
所有需要用到currentPrice的操作都放到回调函数中,保证变量赋值完成后再执行:
//Get the current market price var marketSymobl = checkOrders[i].symbol.split(" - ")[0].toUpperCase() console.log(checkOrders[i].symbol) finnhubClient.quote(marketSymobl, (error, data, response) => { const currentPrice = data.c // 所有依赖currentPrice的逻辑都写在这里 console.log(currentPrice) // 后续处理代码 });
方案2:封装Promise配合async/await
如果要避免多层回调嵌套,可将请求封装为Promise,用同步书写逻辑处理异步流程:
// 封装quote请求为Promise对象 function getCurrentPrice(symbol) { return new Promise((resolve, reject) => { finnhubClient.quote(symbol, (error, data, response) => { if (error) return reject(error) resolve(data.c) }) }) } // 在async函数中调用 async function handleOrder() { const marketSymobl = checkOrders[i].symbol.split(" - ")[0].toUpperCase() console.log(checkOrders[i].symbol) // 等待请求返回后再执行后续逻辑 const currentPrice = await getCurrentPrice(marketSymobl) console.log(currentPrice) // 后续处理代码 } // 触发执行 handleOrder()
内容的提问来源于stack exchange,提问作者Calin89
相关产品推荐
相关产品推荐

