首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Coroutine示例

Coroutine示例
EN

Stack Overflow用户
提问于 2018-04-27 03:47:17
回答 1查看 708关注 0票数 0

在学习JavaScript中的协同机制时,我无法理解下面的示例

代码语言:javascript
复制
coroutine(function* () {
  let posts = yield fetchPosts();
  let promises = posts.map(post => fetchComments(post));
  let comments = yield Promise.all(promises);
  displayComments(comments);
})

function coroutine(fn) {
  let gen = fn();
  let doNext = (data) => {
    let next = gen.next(data);
    if (!next.done) {
      return next.value.then(doNext);
    }
  };
  doNext();
}

在我看来,在上面的示例中调用coroutine时,doNext将累计被调用两次。

当调用coroutine时,生成器函数在其第一行let posts = yield fetchposts();上停止执行;控件被传递回coroutine函数。在let next = gen.next(data);行,控制被传递回生成器函数。

现在,据我所知,fetchposts将在这个时候返回一个包含所有帖子的承诺。因此,这将是doNext的第一次运行。

doNext的第二次运行将在生成器函数在行let comments = yield Promise.all(promises);停止执行时开始;将控制权返回给coroutine函数。在这个时刻,next.value.then(doNext)对我来说不再有意义了。我希望next.value是能够解决这些评论的承诺。

也就是说,Promises.all(promises)是通过生成器函数传回的。因此,一旦所有评论都由post承诺获取,这个问题就应该得到解决。

显然,我没有正确地看到这一点,因为我给出的解释不符合调用的实际执行。我看错什么了?

EN

回答 1

Stack Overflow用户

发布于 2018-04-29 21:13:12

也许它有助于扩展递归的doNext函数来可视化执行流程:

代码语言:javascript
复制
function* fn() {
  let posts = yield fetchPosts();
  let promises = posts.map(post => fetchComments(post));
  let comments = yield Promise.all(promises);
  displayComments(comments);
}

let gen = fn();
let data;
let next = gen.next(data); // data is undefined
                           // generator runs until first yield
                           // next.value becomes fetchPosts()
// assert(!next.done)
next.value.then(data => {
  let next = gen.next(data); // data is result of fetchPosts()
                             // generator runs until second yield:
                             //  posts becomes passed value (data)
                             //  promises becomes posts.map(…)
                             // next.value becomes Promise.all(…)
  // assert(!next.done)
  next.value.then(data => {
    let next = gen.next(data); // data is result of Promise.all(…)
                               // generator runs until the end:
                               //  comments becomes passed value (data)
                               //  comments are logged
                               // next.value becomes undefined
    // assert(next.done)
  });
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50054932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档