javascript - ES6生成器中如何将第一个yield的值传递到下一个yield?

标签 javascript ecmascript-6 generator yield

我搜索了 ES6 生成器的真实案例,但没有找到正确的解释。我试图理解第一个Promise场景。

假设我们有 2 个剩余 api:getUsergetUserComments

我们不想创建避免嵌套then回调功能的线性代码结构。所以...

定义模拟 API

function getUser () {
    return new Promise(function(resolve, reject) {
       return setTimeout(function() { resolve({id: 1, label: 'John'}); }, 200);
    });
}

function getUserComments(userId) {
    return new Promise(function(resolve, reject) {
      return setTimeout(function() {resolve({comments: 'comments', userId: userId}); }, 200);
    });
}

定义生成器

function* generator () {
  yield getUser();
  yield getUserComments(userId); // userId represents data from first request / first yield how should I pass it ?!
}

var g = generator();
var first  = g.next(1);
var second = g.next(2);

如何从第一个yield (yield getUser()) 获取响应并将其传递给下一个yield (yield getUserComments(userId)) ?

最佳答案

您可以将生成的结果分配给变量:

The next() method also accepts a value which can be used to modify the internal state of the generator. A value passed to next() will be treated as the result of the last yield expression that paused the generator. (From MDN, Advanced generators)

既然你正在处理 Promises,那么使用 async/await 将其解包为值是有意义的。

试试这个(我稍微修正了 setTimeout 参数):

async function getUser() {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, 0, {
      id: 1,
      label: 'John'
    })
  })
};

async function getUserComments(user) {
  return new Promise(function(resolve, reject) {
    setTimeout(resolve, 0, {
      ...user,
      comments: 'comments',
    }, 'userComments');
  });
}

function* generator () {
  const user = yield getUser();
  yield getUserComments(user);
}

(async function () {
  const g = generator();
  const user = await g.next().value
  const comments = await g.next(user).value

  console.log(comments)
})()

关于javascript - ES6生成器中如何将第一个yield的值传递到下一个yield?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49252333/

相关文章:

javascript - event.which 和 event.keycode 不适用于 Internet Explorer 10 的退格按钮

python - 如何从多个项目的缓冲区中生成单个项目并定期重新填充缓冲区?

javascript - (state = {}) => state 是什么意思

javascript - 带有 JSON 对象的 ES6 getter setter

javascript - React Hooks - 无需调用即可内存函数

java - JDK 中没有可用的安全随机数生成器

python - 如何在特定时间退出生成器?

javascript - 在 .click jquery 上更改页面不透明度

javascript - 使用带有数据数组的 Jquery 创建密度热图图表

javascript - Angular ModalController 是它自己的文件