在之前的讨论中,我们展示了generator是如何的进行异步迭代的。这是建立在对杂乱无章的回调函数进行序列化的一次巨大的进步。但我们也失去了一些很重要的东西,也就是Promises的信任和组合。不要担心,我们现在就将两者结合起来使用。
回忆一下之前的基于promise的异步的例子
在之前的运行ajax例子的generator代码中,foo()返回undfined,并且我们的迭代控制器代码并不关心yielded的值。function
foo
(
x
,
y
)
{
return
request
(
"http://some.url.1/?x="
+
x
+
"&y="
+
y
);
}
foo
(
11
,
31
)
.
then
(
function
(
text
){
console
.
log
(
text
);
},
function
(
err
){
console
.
error
(
err
);
}
);
但是基于promise的foo()在ajax call后返回一个promise对象,这暗示这里需要用foo()构建一个promise函数,然后从generator这边停止,然后迭代控制的代码将会收到promise对象。
那么迭代器是如何处理promise的呢?
它应该去监听promise对象resolve的状态(fulfillment or rejection),要么继续generator,要么抛出异常到generator。
最有效的利用promise和generator的方式是停止等待promise对象的返回,并且通过promise对象去控制generator的迭代器