.then()及async/await返回Promise而非解析后的数据问题
解决Promise异步响应无法直接返回数据的问题
你遇到的核心问题其实是JavaScript异步机制的本质:不管是用.then()链式调用还是async/await语法,异步操作的结果都没法直接同步返回——因为异步代码的执行不会阻塞主线程,程序不会等AJAX请求完成再继续往下走。
先看你代码里的关键误区
- 第一个写法里,你尝试
return hit_db().then(data => { return data; });——这里.then()本身就会返回一个新的Promise,哪怕你在回调里return了data,整个表达式的结果还是Promise,而不是data本身。你不能把异步结果直接return出去当成同步值用。 - 第二个
async/await的写法里,async标记的函数必然返回Promise,哪怕你内部return data,这个值也会被自动包装成Promise对象返回,所以return handler()得到的肯定还是Promise,不是实际数据。
正确的处理方式
所有依赖异步请求结果的逻辑,都必须放在异步回调内部或者await之后的代码块里:
方式1:使用.then()链式调用处理结果
直接在.then()的回调里使用拿到的data,而不是试图return它:
function hit_db() { return new Promise(function (resolve, reject) { $.ajax({ url: target_url, type: "GET", async: true, crossDomain: true, success: function (data) { resolve(data); }, error: function (err) { reject(err); // 这里注意你原来写的reject(error)是笔误,参数应为err } }); }); } // 正确使用方式:在then里处理数据 hit_db() .then(data => { // 在这里做你需要的操作,比如打印、渲染页面等 console.log(data); // 这里就能拿到"Great! Success!" }) .catch(err => { console.error('请求失败:', err); });
方式2:用async/await处理结果
async/await只是.then()的语法糖,你依然需要在async函数内部处理数据,或者在调用时用.then()获取返回的Promise结果:
function hit_db() { return new Promise(function (resolve, reject) { $.ajax({ url: target_url, type: "GET", async: true, crossDomain: true, success: function (data) { resolve(data); }, error: function (err) { reject(err); // 修复参数错误 } }); }); } async function handler() { try { var data = await hit_db(); // 在这里直接使用data console.log('请求成功:', data); // 如果需要把数据传递给外部,还是要通过Promise的方式 return data; } catch (error) { console.error('Network call failed:', error); throw error; // 抛出错误让外部捕获 } } // 调用handler并获取结果 handler() .then(data => { console.log('从handler拿到的数据:', data); }) .catch(err => { console.error(err); });
核心总结
JavaScript里的异步操作结果,永远只能在异步上下文里使用——要么是.then()/.catch()的回调函数,要么是async函数中await之后的代码块。你没法跳过异步流程,直接同步拿到异步操作的结果。
内容的提问来源于stack exchange,提问作者megs56
相关产品推荐
相关产品推荐

