将ES6生成器与XMLHttpRequest一起使用

时间:2016-05-13 17:55:17

标签: javascript ajax ecmascript-6 generator

我试图简化我使用ES6生成器进行AJAX调用的方式。但是,我遇到了一些问题:

readyState

只是对我尝试做的事情的简要说明:我希望产生每个请求状态更改的就绪状态。我在生成器的每次迭代中记录{value: 2, done: false} {value: undefined, done: true} {value: undefined, done: true} 字符串。但是当我运行这段代码时,我得到了:

//... new XMLHttpRequest()...
xhr.onreadystatechange = function() {console.log(xhr.readyState)}

其表面看起来是正确的,但如果我做一个老式的XHR:

2
3
4

我明白了:

readyState

那么......我在使用发电机时哪里出错?

更新

更奇怪的是,如果我在生成器中记录// HERE xhr.onreadystatechange = function() {console.log(xhr.readyState, gen.next())};

2, {value: 2, done: false}
3, {value: undefined, done: true}
4, {value: undefined, done: true}

我明白了:

readyState

这意味着,调用next()方法时可以使用正确的yield。我只能猜测我使用的onreadystatechange语句只注册一次,因此生成器只分配一个插槽。我认为,由于{{1}}不止一次被调用,因此将分配更多的时隙。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

当你"打电话"一个生成器函数,它运行到第一个yield语句,然后暂停,直到调用它的next方法。在此之后,它将继续运行,直到发生另一个yield语句或函数或控件离开函数。在后一种情况下,对next方法的所有调用都将返回undefined

你想要的是一个循环,它在每次迭代时检查xhr的readyState

function *statechange() {
  while(true) { // loop forever
    yield xhr.readyState;
  }
}

如果您熟悉Python中的生成器,则完全相同。

我要去第二个@Paul S。评论说这并不能真正简化xhrs,你应该查看承诺。