在 javascript 中产生 promise 时会发生什么?
What happens when promise is yielded in javascript?
没有找到完整答案..
当 promise 被 yield 时会发生什么?
是这样的构造
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
相当于
function * (){
yield value
}
?
更新
如何混合使用不同风格的异步编程,例如 koa 这样的框架?
Koa 中间件与生成器一起工作,但是有很多基于 promise 的好包(例如 sequelize)
What happens when promise is yielded?
没什么特别的。承诺只是一个对象。生成器将产生该承诺,您可以订阅它:
var promise = generator().next().value;
promise.then(...);
正如 Felix 所说,承诺只是要产生的另一种价值。
但是,有一种编写异步代码的风格,它以特定方式使用 yielded promises。这涉及调用生成器的周围代码,然后等待 yielded promise 解析,然后且仅在此时向生成器询问下一个值。这允许您将程序编写为:
function goGenerator *() {
var userData = yield getUserData();
yield checkuserData(userData);
}
其中 getUserData
和 checkUserData
return 都是一个承诺。这比必须写
要干净一点
function goPromises() {
return getUserData() . then(checkUserData);
}
尤其是涉及到更多的承诺时。这种基于生成器的样式按顺序读取,让人想起异步函数方法。
async function goAsyncFunction() {
var userData = await getUserData();
return await checkUserData(userData);
}
但是异步函数还没有得到广泛支持。基于生成器的方法是一种与纯 ES6 一起工作的替代方法。
正如我所提到的,基于生成器的方法需要一段代码 "surrounding" 它知道如何处理产生的承诺——正如我所说,就是等待它们解决之前再次调用生成器。这个的经典实现是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
本身 return 是一个承诺,所以你可以挂更多的东西:spawn(goGenerator) . then(doMoreStuff)
.
这是一个非常简单的实现。 co
有更多的特性——例如,你可以 yield
一组承诺,它会等待所有承诺的解决,a la Promise.all
.
没有找到完整答案..
当 promise 被 yield 时会发生什么?
是这样的构造
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
相当于
function * (){
yield value
}
?
更新
如何混合使用不同风格的异步编程,例如 koa 这样的框架?
Koa 中间件与生成器一起工作,但是有很多基于 promise 的好包(例如 sequelize)
What happens when promise is yielded?
没什么特别的。承诺只是一个对象。生成器将产生该承诺,您可以订阅它:
var promise = generator().next().value;
promise.then(...);
正如 Felix 所说,承诺只是要产生的另一种价值。
但是,有一种编写异步代码的风格,它以特定方式使用 yielded promises。这涉及调用生成器的周围代码,然后等待 yielded promise 解析,然后且仅在此时向生成器询问下一个值。这允许您将程序编写为:
function goGenerator *() {
var userData = yield getUserData();
yield checkuserData(userData);
}
其中 getUserData
和 checkUserData
return 都是一个承诺。这比必须写
function goPromises() {
return getUserData() . then(checkUserData);
}
尤其是涉及到更多的承诺时。这种基于生成器的样式按顺序读取,让人想起异步函数方法。
async function goAsyncFunction() {
var userData = await getUserData();
return await checkUserData(userData);
}
但是异步函数还没有得到广泛支持。基于生成器的方法是一种与纯 ES6 一起工作的替代方法。
正如我所提到的,基于生成器的方法需要一段代码 "surrounding" 它知道如何处理产生的承诺——正如我所说,就是等待它们解决之前再次调用生成器。这个的经典实现是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
本身 return 是一个承诺,所以你可以挂更多的东西:spawn(goGenerator) . then(doMoreStuff)
.
这是一个非常简单的实现。 co
有更多的特性——例如,你可以 yield
一组承诺,它会等待所有承诺的解决,a la Promise.all
.