在javascript中产生承诺时会发生什么?
没有找到完整的答案 当承诺兑现时会发生什么 是这样的建设吗在javascript中产生承诺时会发生什么?,javascript,promise,yield,koa,Javascript,Promise,Yield,Koa,没有找到完整的答案 当承诺兑现时会发生什么 是这样的建设吗 var p = new Promise() p.resolve(value) function * (){ yield p } 相当于 function * (){ yield value } ? 更新 如何混合不同的异步编程风格,例如膝关节炎的KOA? Koa Middleware正在使用生成器,但是有很多基于承诺的好包(sequelize for ex.) 当承诺兑现时会发生什么 没什么特别的。承诺只是一个目标。发电机
var p = new Promise()
p.resolve(value)
function * (){
yield p
}
相当于
function * (){
yield value
}
?
更新
如何混合不同的异步编程风格,例如膝关节炎的KOA?
Koa Middleware正在使用生成器,但是有很多基于承诺的好包(sequelize for ex.)
当承诺兑现时会发生什么
没什么特别的。承诺只是一个目标。发电机将产生该承诺,您可以订阅该承诺:
var promise = generator().next().value;
promise.then(...);
正如费利克斯所说,承诺只是另一种要产生的价值 然而,有一种编写异步代码的风格,它以特定的方式使用产生的承诺。这涉及到一段周围的代码,该代码调用生成器,然后等待所产生的承诺得到解决,然后仅在随后向生成器请求下一个值。这允许您将程序编写为:
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
——你可以用谷歌搜索它。或者你也可以自己写:
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)。然后(domorteuff)
这是一个非常简单的实现co
还有更多的特性——例如,你可以产生一系列承诺,它将等待所有承诺的解决,一个la承诺。所有的有趣的事情只是对产生承诺的生成器所做的事情。它本身没有什么特别之处。我不明白你的问题。你只需在膝关节炎请求处理程序中产生一个承诺,就可以进行解释。我已经更新了问题。真正的问题不是如何将生成器转换为承诺,而是如何将承诺转换为生成器。需要在承诺上下文中使用生成器。我不明白“将承诺转换为生成器”是什么意思。你能用通俗易懂的英语解释吗?完整性请参见此。它还有一个异常处理方面需要考虑。