如何在无法执行指定回调时返回Ajax响应?(第三方代码固定)
解决Ajax异步响应返回问题
你遇到的核心问题是Ajax请求是异步的,直接在myfunction里return根本等不到请求完成就会先返回undefined。不过好在我们可以利用Promise来解决这个问题,刚好外部代码已经用了Promise链,完美适配!
最简单的解决方案:直接返回jQuery Ajax的结果
jQuery的$.get(以及其他Ajax方法)返回的jqXHR对象本身就兼容Promise规范,所以你只需要把它直接return出去就行,外部的Promise链会自动等待请求完成:
var myfunction = function( param ) { // 关键:返回$.get的结果,它是一个Promise-like对象 return $.get( '/search', { q: param } ); }; Promise.resolve() .then( function() { return myfunction( param ); } ) .then( function( res ) { // 这里的res就是Ajax请求返回的数据啦 return somefunction( res ); }) // 别忘了加上错误处理,避免请求失败时整个链断掉 .catch(function(error) { console.error('搜索请求出错:', error); });
如果你需要标准ES Promise(可选)
如果担心jqXHR的兼容性,或者想使用更标准的Promise写法,可以把Ajax请求包装成一个原生Promise:
var myfunction = function( param ) { return new Promise(function(resolve, reject) { $.get( '/search', { q: param } ) .done(function(responseData) { // 请求成功时,把数据传给resolve resolve(responseData); }) .fail(function(error) { // 请求失败时,把错误传给reject reject(error); }); }); };
原理说明
异步操作没办法同步返回结果,必须通过"异步通知"的方式传递数据。Promise就是干这个的:当你在myfunction里返回一个Promise时,外部的.then()会等到这个Promise状态变为"已完成"(请求成功),才会把响应数据传给下一个处理函数somefunction。
内容的提问来源于stack exchange,提问作者Pascal C.
相关产品推荐
相关产品推荐

