正如 Felix 所说,承诺只是要产生的另一个价值。
但是,有一种编写异步代码的风格,它以特定的方式利用产生的 Promise。这涉及到一段代码,它调用生成器,然后等待产生的承诺解决,然后才向生成器询问下一个值。这使您可以将程序编写为:
function goGenerator *() {
var userData = yield getUserData();
yield checkuserData(userData);
}
getUserData 和 checkUserData 都返回一个承诺。比不得不写要干净一点
function goPromises() {
return getUserData() . then(checkUserData);
}
特别是如果涉及更多的承诺。这种基于生成器的样式顺序读取,让人想起异步函数方法。
async function goAsyncFunction() {
var userData = await getUserData();
return await checkUserData(userData);
}
但异步函数尚未得到广泛支持。基于生成器的方法是一种适用于纯 ES6 的替代方法。
正如我所提到的,基于生成器的方法需要一段代码“围绕”它,该代码知道如何处理产生的 Promise——正如我所说,在调用生成器之前等待它们解决再次。经典的实现是co——你可以谷歌一下。或者你可以自己写:
function spawn(generator) {
var iterator = generator();
return new Promise(
resolve =>
function iterate(val) {
var {value, done} = iterator.next(val);
if (done) { resolve(val); }
else { Promise.resolve(value).then(iterate); }
}()
);
}
现在你运行spawn(goGenerator)。 spawn 本身返回一个承诺,所以你可以挂更多的东西:spawn(goGenerator) . then(doMoreStuff)。
这是一个非常简单的实现。 co 有更多的特性——例如,你可以 yield 一个 promise 数组,它会等待它们全部解决,例如 Promise.all。