【问题标题】:What happens when promise is yielded in javascript?在 javascript 中产生 promise 时会发生什么?
【发布时间】:2016-03-01 02:14:03
【问题描述】:

没有找到完整的答案..

当 Promise 产生时会发生什么?

是这样的构造

var p = new Promise()
p.resolve(value)

function * (){
  yield p
}

相当于

function * (){
  yield value
}

?

更新

如何混合不同风格的异步编程,例如 koa 之类的框架?

Koa 中间件正在使用生成器,但是有很多基于 Promise 的优秀包(例如,sequelize)

【问题讨论】:

  • 有趣的只是产生承诺的生成器做了什么。它本身并没有什么特别之处。

标签: javascript promise yield koa


【解决方案1】:

当 Promise 产生时会发生什么?

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

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

【讨论】:

    【解决方案2】:

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

    但是,有一种编写异步代码的风格,它以特定的方式利用产生的 Promise。这涉及到一段代码,它调用生成器,然后等待产生的承诺解决,然后才向生成器询问下一个值。这使您可以将程序编写为:

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

    getUserDatacheckUserData 都返回一个承诺。比不得不写要干净一点

    function goPromises() {
      return getUserData() . then(checkUserData);
    }
    

    特别是如果涉及更多的承诺。这种基于生成器的样式顺序读取,让人想起异步函数方法。

    async function goAsyncFunction() {
      var userData = await getUserData();
      return await checkUserData(userData);
    }
    

    但异步函数尚未得到广泛支持。基于生成器的方法是一种适用于纯 ES6 的替代方法。

    正如我所提到的,基于生成器的方法需要一段代码“围绕”它,该代码知道如何处理产生的 Promise——正如我所说,在调用生成器之前等待它们解决再次。经典的实现是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) . then(doMoreStuff)

    这是一个非常简单的实现。 co 有更多的特性——例如,你可以 yield 一个 promise 数组,它会等待它们全部解决,例如 Promise.all

    【讨论】:

    • 感谢您的精彩解释。我已经更新了问题。真正的问题不是如何将生成器转换为 Promise,而是如何将 Promise 转换为生成器。
    • Proper Generator-to-Promise Adapter 需要在 Promise 上下文中使用生成器。
    • 我不明白您所说的“将承诺转换为生成器”是什么意思。你能用简单的英语解释一下吗?
    • 为了完整起见,请参阅generator-to-promise adapter。还有一个异常处理方面需要考虑。
    猜你喜欢
    • 2019-10-12
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2018-07-17
    • 2019-08-30
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多