在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
承诺。所有的

有趣的事情只是对产生承诺的生成器所做的事情。它本身没有什么特别之处。我不明白你的问题。你只需在膝关节炎请求处理程序中产生一个承诺,就可以进行解释。我已经更新了问题。真正的问题不是如何将生成器转换为承诺,而是如何将承诺转换为生成器。需要在承诺上下文中使用生成器。我不明白“将承诺转换为生成器”是什么意思。你能用通俗易懂的英语解释吗?完整性请参见此。它还有一个异常处理方面需要考虑。