Q: JavaScript在一个function中使用ajax请求,如何才能将ajax返回的结果作为function的返回值

2013 年 12 月 1 日
 liaa
深夜来V2讨教一个问题:

代码如下:

```js
function loadAllGists(username){
var gists = null;
$.ajax({
url: 'https://api.github.com/users/'+username+'/gists'
}).done(function(data) {
console.log('ajax compelete');
gists = data;
});
console.log('function compelete');
return gists;
}
```

var gistsOfliaa = loadAllGists('liaa');
这里我希望gistsOfliaa是 ajax的返回值. 但是因为ajax是异步过程,所以loadAllGists方法返回值是undefined.

想问下如何才能达到我想要的目的.即:在一个function中使用ajax请求,如何才能将ajax返回的结果作为function的返回值
8646 次点击
所在节点    问与答
12 条回复
binux
2013 年 12 月 1 日
不可以
liaa
2013 年 12 月 1 日
@binux 好像只有用callback了...
toctan
2013 年 12 月 1 日
@binux @liaa 其实是可以的,ajax 传入 async: false 只是不推荐这样做,这样 ajax call 就是 synchronous 的,会 block
lizheming
2013 年 12 月 1 日
改成同步可以么?
liaa
2013 年 12 月 1 日
@toctan 是的这样子只追求代码的简洁会得不偿失...
binux
2013 年 12 月 1 日
@toctan ajax = Asynchronous JavaScript and XML,那就不叫ajax请求了
虽然没法直接 var =
但是callback也可以写得比较简单
davepkxxx
2013 年 12 月 1 日
我们公司的做法是async: false
justfly
2013 年 12 月 1 日
研究了python异步网络框架tornado,js如果支持生成器(yield),就能搞定同步风格写异步代码,不 block 页面
justfly
2013 年 12 月 1 日
但是 js 不支持,所以还要回掉写
undozen
2013 年 12 月 1 日
1. HTTPXmlRequest 可以發同步請求,但請求期間瀏覽器會卡住
2. 你看看 promise 會不會接近你想要的
gouflv
2013 年 12 月 1 日
callback 或者 promise , 没有其他模式了, async: false一般不会推荐
rankjie
2013 年 12 月 1 日
硬要这样的话。。。那就:
node --harmony有yield(0.11版本以上就支持了似乎)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/91323

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX