JS 如何保证 ajax 顺序,写了个小东西

2017-03-19 12:14:57 +08:00
 xujinkai

非前端,轻吐槽- -

自己做 spa 弄的,想要先判断是不是登录,如果登录的话,再去加载别的信息。

以下是示例,效果就是先获取 session ,如果登录的话,再运行 callback 。

$.get('/session', (data)=>{
	if(data.login) loading.done('login');
}

//然后在别的文件里
loading.run_after(callback, 'login');

callback 会在 login 后才执行,第二个参数也可以是 Array

不知会不会有用,本体很短,地址在这里 (忽略这个仓库,还没做完...)

3633 次点击
所在节点    JavaScript
12 条回复
guokeke
2017-03-19 12:19:52 +08:00
我觉得你直接回掉就好。

如果你觉得不优雅可以看看 Promise.
jarlyyn
2017-03-19 12:21:21 +08:00
楼主看过 async.js 吗?
think2011
2017-03-19 12:31:29 +08:00
目测楼主用的是 jquery ,你可以试试这样

```js
function fetchSession() {
// 防止多次请求
if(window.SESSION) return $.when(window.SESSION)

return $.get('/session', (data) => {
window.SESSION = data.login
return data.login
}
}

fetchSession().then( data => {
// do sth
})


fetchSession().then( data => {
// do sth2
})
```
oott123
2017-03-19 12:36:17 +08:00
挺不错的小轮子。不过 loading.run_after 的两个参数如果对调的话应该会更好看。

当然了,从实用和工程的角度来说,还是看看 Promise 比较好……
loading
2017-03-19 12:51:43 +08:00
恩,对我这个程序写着玩的销售很有用。

感谢分享!
xujinkai
2017-03-19 13:24:08 +08:00
@loading 你的名字
@think2011 感谢分享
@jarlyyn 没...去看看
@guokeke @oott123
我知道 promise ,不过 promise 得把函数都改造成 promise 吧,而且链式调用都得写一起,就造了这个,作为小项目,啥都不用改,直接传函数就行。
oott123
2017-03-19 13:31:27 +08:00
完全不用改别的地方。就你这个需求而言,可以直接用 promise 写好,和你的几乎等价:

https://gist.github.com/a1001fdfd0d33d8711f5b7aa12f666fe
oott123
2017-03-19 13:34:19 +08:00
Promise 并不一定要求你在所有地方都用 Promise ,这是一个误解。

你可以把 Promise 和回调等异步手段混用,没有任何问题。只是从实践角度而言,不推荐这么写(主要是维护起来很乱)。

作为小项目,更应该尝试使用新鲜有趣的设计、保持快速迭代。
xujinkai
2017-03-19 13:35:10 +08:00
@oott123 学习了 非常感谢
jzz7280
2017-03-19 16:18:01 +08:00
建议看看"你不知道的 javascript"中卷
iyangyuan
2017-03-19 19:05:49 +08:00
有些顺序也可以巧妙的通过 js 单线程模型实现
chaegumi
2017-03-20 09:06:40 +08:00
LABjs

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

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

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

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

© 2021 V2EX