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

2013-12-01 00:13:35 +08:00
 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的返回值
7971 次点击
所在节点    问与答
12 条回复
binux
2013-12-01 00:20:17 +08:00
不可以
liaa
2013-12-01 01:11:03 +08:00
@binux 好像只有用callback了...
toctan
2013-12-01 01:18:23 +08:00
@binux @liaa 其实是可以的,ajax 传入 async: false 只是不推荐这样做,这样 ajax call 就是 synchronous 的,会 block
lizheming
2013-12-01 01:18:43 +08:00
改成同步可以么?
liaa
2013-12-01 02:05:26 +08:00
@toctan 是的这样子只追求代码的简洁会得不偿失...
binux
2013-12-01 02:29:13 +08:00
@toctan ajax = Asynchronous JavaScript and XML,那就不叫ajax请求了
虽然没法直接 var =
但是callback也可以写得比较简单
davepkxxx
2013-12-01 02:36:56 +08:00
我们公司的做法是async: false
justfly
2013-12-01 02:44:37 +08:00
研究了python异步网络框架tornado,js如果支持生成器(yield),就能搞定同步风格写异步代码,不 block 页面
justfly
2013-12-01 02:45:47 +08:00
但是 js 不支持,所以还要回掉写
undozen
2013-12-01 07:15:06 +08:00
1. HTTPXmlRequest 可以發同步請求,但請求期間瀏覽器會卡住
2. 你看看 promise 會不會接近你想要的
gouflv
2013-12-01 09:23:17 +08:00
callback 或者 promise , 没有其他模式了, async: false一般不会推荐
rankjie
2013-12-01 23:35:07 +08:00
硬要这样的话。。。那就:
node --harmony有yield(0.11版本以上就支持了似乎)

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

https://www.v2ex.com/t/91323

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

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

© 2021 V2EX