当在javascript中产生promise时会发生什么

What happens when promise is yielded in javascript?

本文关键字:什么 promise 当在 javascript      更新时间:2023-09-26

未找到完整答案。。

当承诺兑现时会发生什么?

这样的建筑是吗

var p = new Promise()
p.resolve(value)
function * (){
  yield p
}

相当于

function * (){
  yield value
}

更新

如何混合不同风格的异步编程,例如对于像koa这样的框架?

Koa中间件使用生成器,但有很多好的包是基于promise的(例如sequelize)

正如Felix所说,承诺只是要产生的另一个价值。

然而,有一种编写异步代码的风格,它以特定的方式使用已产生的promise。这涉及到一段周围的代码,该代码调用生成器,然后等待生成的promise得到解析,然后才向生成器请求下一个值。这允许您将程序编写为:

function goGenerator *() {
  var userData = yield getUserData();
  yield checkuserData(userData);
}

其中getUserDatacheckUserData都返回一个promise。这比必须写要干净一点

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本身返回一个promise,所以您可以挂起它的更多内容:spawn(goGenerator) . then(doMoreStuff)

这是一个非常简单的实现。co还有更多的功能——例如,您可以yield一个promise数组,它将等待所有这些promise都得到解决,即一个la Promise.all

当承诺兑现时会发生什么?

没什么特别的。承诺只是一个对象。生成器将产生该承诺,您可以订阅它:

var promise = generator().next().value;
promise.then(...);