未找到完整答案..
承诺产生后会发生什么?
是这样的建筑
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
相当于
function * (){
yield value
}
更新
如何混合不同风格的异步编程,例如像koa这样的框架?
Koa中间件正在使用生成器,但是有很多好的软件包是基于承诺的(例如,sequelize)
答案 0 :(得分:6)
承诺产生后会发生什么?
没什么特别的。承诺只是一个对象。生成器将产生该承诺,您可以订阅它:
var promise = generator().next().value;
promise.then(...);
答案 1 :(得分:5)
菲利克斯说,承诺只是另一个值得屈服的价值。
然而,有一种编写异步代码的方式,它以特定的方式使用产生的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一起使用的替代方法。
正如我所提到的,基于生成器的方法需要一段代码"围绕"它知道如何处理所产生的承诺 - 正如我所说的那样,在再次调用发生器之前等待它们解决。这个经典的实现是co
- 你可以Google。或者你可以写自己的:
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.all
。