我试图简化我使用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}}不止一次被调用,因此将分配更多的时隙。我该如何解决这个问题?
答案 0 :(得分:3)
当你"打电话"一个生成器函数,它运行到第一个yield
语句,然后暂停,直到调用它的next
方法。在此之后,它将继续运行,直到发生另一个yield
语句或函数或控件离开函数。在后一种情况下,对next
方法的所有调用都将返回undefined
。
你想要的是一个循环,它在每次迭代时检查xhr的readyState
:
function *statechange() {
while(true) { // loop forever
yield xhr.readyState;
}
}
如果您熟悉Python中的生成器,则完全相同。
我要去第二个@Paul S。评论说这并不能真正简化xhrs,你应该查看承诺。