1
alber1986 2017-08-28 10:44:13 +08:00
我也想知道
|
2
biuuu 2017-08-28 10:52:15 +08:00
用递归啊
|
3
Arrowing 2017-08-28 10:56:05 +08:00
在客户端的 ajax 代码里,success 和 error 里发出下一次请求,难道这样不可以吗?
|
4
chenyu8674 2017-08-28 10:59:37 +08:00
没太理解 LZ 的意思,不过从描述来看不难实现啊
1. 从前一个请求的 onResponse 里触发下一个请求 2. 维护一个请求任务列表按顺序调用 |
5
abcbuzhiming OP @biuuu 逻辑设计上讲,用递归是不合理的,递归从原理上讲必须有出口,也就是递归深度是事先设定好的,有穷的,虽然我这个案例里 JS 的请求从实际上讲,必然会有退出的可能性(比如出错),但是从场景上来讲,这是一个无限循环,所以我觉得递归没法用在这里,难道你不怕栈溢出?还是你说的递归和我想的不是一个东西?
|
6
ETiV 2017-08-28 11:01:45 +08:00 via iPhone 1
async.queue
并发设置好,直接 push 相应数量的回调函数;每一次请求收到响应后再 push 一次,就可以车轮一样,无限次了…… 另外你要是做聊天,不要「一个请求结束后才发起另外一个」,相邻两次连接中间的空档期会丢消息的。 |
7
wunonglin 2017-08-28 11:02:17 +08:00
怎么不用 WebSocket ?
|
8
abcbuzhiming OP |
9
abcbuzhiming OP @ETiV 你这是客户端的东西?我放狗半天没搜到,我现在要解决的是客户端无限轮询问题,服务端不需要担心,不会丢消息的
|
10
abcbuzhiming OP @wunonglin IE8,没法用
|
11
hxsf 2017-08-28 11:15:31 +08:00
function fetch_once () {
fetch(......, function(err, data) { // your codes here setTimeout(fetch_once, 1000 /* delay */ ) // or use `nextTick` }) } |
12
ETiV 2017-08-28 11:17:54 +08:00 via iPhone
|
13
flowfire 2017-08-28 11:18:54 +08:00
let getMessage = cb => {
// xhr 操作 xhr.onreadyStateChange = () => { // if(XXX) return; let res = xhr.responseText; if (res.success) { // 操作数据 } cb(); } } ........我还是没懂难度在哪里 |
14
flowfire 2017-08-28 11:21:54 +08:00
如果可以用 async 那就更简单了
let do = async () => { while(true){ await new Promise((res,rej)=>{ // xhr 操作 // 收到数据后 res(); }); } } do(); |
16
flowfire 2017-08-28 11:28:44 +08:00
|
17
abcbuzhiming OP |
18
iskyzh 2017-08-28 11:34:45 +08:00 via Android
@abcbuzhiming 个人认为 JavaScript 里的回调不能等同于递归。诸如 function a() { a(); } 必然是会栈溢出的。但是回调不应该这么理解,因为触发事件执行回调的时候,入口函数应该是「被触发的事件」,而非「注册回调的地方」。因此在 onsuccess/onerror 里再去发 ajax 请求是可行的,而且不会导致爆栈。
|
20
mooncakejs 2017-08-28 14:19:33 +08:00
const loop = async ()=>{
while(true){ await ping() await sleep(10000) } } |
24
xieranmaya 2017-08-28 17:30:37 +08:00
异步递归啊:
```js (function r() { fetch(url).then(r) }()) ``` |
25
lamada 2017-08-28 23:19:35 +08:00 via Android
eventstream
|
26
ryd994 2017-08-29 08:07:21 +08:00
@abcbuzhiming 有尾递归优化的情况下,递归等效于循环
这也是为什么对函数式语言尾递归优化这么重要的原因:因为函数式语言的循环一般就是递归实现的 |
27
abcbuzhiming OP @ryd994 想请教一个问题,递归不都应该有出口吗?如果是无限循环比如 while(true),也能用尾递归等效?这什么原理
|
28
ryd994 2017-08-29 11:16:44 +08:00 via Android
@abcbuzhiming 没有尾递归优化的话,调用栈会一直往上堆,直到爆掉。所以在大多数过程式语言里,一般不建议递归太多层,而且会很小心返回条件。
有尾递归优化的话,尾调用只是等于赋值然后跳转被调用函数,不需要保留调用函数的内容。正确使用的话不会爆栈。 函数式编程只考虑基本元素,不考虑运行环境的高阶函数的话,循环只能用递归表示。 |
29
xieranmaya 2017-08-29 19:52:47 +08:00
再贴一个写法:
(async function r() { await fetch(url) r() }()) 楼主你要知道,异步递归不是真的递归,是不会产生调用栈的 所以对于异步代码分析什么尾递归,调用栈都基本没什么意义 |