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

标签 javascript promise yield koa

没有找到完整的答案..

当 promise 被 yield 时会发生什么?

是这样的构造

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

function * (){
  yield p
}

相当于

function * (){
  yield value
}

?

更新

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

Koa 中间件与生成器一起工作,但是有很多基于 promise 的好包(例如 sequelize)

最佳答案

正如 Felix 所说, promise 只是要产生的另一种值(value)。

但是,有一种编写异步代码的风格,它以特定方式使用 yielded promises。这涉及调用生成器的周围代码,然后等待 yielded promise 解析,然后且仅在此时向生成器询问下一个值。这允许您将程序编写为:

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

getUserDatacheckUserData 都返回一个 promise 。它比必须编写要干净一些

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

尤其是涉及到更多的 promise 时。这种基于生成器的样式按顺序读取,让人联想到异步函数方法。

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 本身会返回一个 promise,因此您可以挂起更多内容:spawn(goGenerator)。然后(doMoreStuff)

这是一个非常简单的实现。 co 具有更多功能——例如,您可以yield 一组 promise,它会等待所有这些都解决,一个 la Promise。所有

关于javascript - 当 promise 在 javascript 中产生时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947850/

相关文章:

javascript - 在 React Native 中使用 prop 启动计时器

php - 如何找到修改了哪个输入字段?

python - 为什么我的 Python 测试生成器根本不起作用?

c# - yield return 和 try-catch.(C#)

python - 在通过map()调用的函数中使用yield关键字代替return

javascript - 一个像幻灯片一样工作的单页网站

javascript - 选择兄弟节点时如何递归取消选择堂兄弟节点(递归呈现的复选框)

javascript - 从 promise 对象或数组中提取数据

javascript - jQuery - 防止通过 ajax 后验证提交内部 promise

javascript - 将无限循环中的等待转换为原始 promise.then