首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以用waitOneCycle.then(waitOneCycle().then(...))编写一系列promises,然后再编写处理程序吗?但是没有很深的嵌套吗?

可以用waitOneCycle.then(waitOneCycle().then(...))编写一系列promises,然后再编写处理程序吗?但是没有很深的嵌套吗?
EN

Stack Overflow用户
提问于 2020-08-08 00:27:00
回答 1查看 22关注 0票数 0

如果我们已经有了

代码语言:javascript
运行
复制
const waitOneCycle = () => {
  return new Promise(resolve => setTimeout(resolve));
};

然后是我们的代码(这是目前在Jest和SinonJS中使用的,尽管它不一定是:)

代码语言:javascript
运行
复制
waitOneCycle()
  .then(() => {
    // do something

  });

它读起来非常优雅:waitOneCyclethen做了一些事情。

但是,如果我们执行一系列操作,我们必须:

代码语言:javascript
运行
复制
waitOneCycle()
  .then(() => {
    // do something

    return waitOneCycle();
  })
  .then(() => {
    // do something

    return waitOneCycle();
  })
  .then(() => {
    // do something

    return waitOneCycle();
  });

它读起来很奇怪,因为我们为什么要返回一些东西来充当"waitOneCycle“呢?这是它的工作方式,但代码只是以一种奇怪的方式阅读。

我们可以这样做:

代码语言:javascript
运行
复制
waitOneCycle()
  .then(() => {

    // not return anything here
  })
  .then(() => {
    waitOneCycle()
      .then(() => {

      });
  })

但这将回到过去的嵌套地狱问题。有没有办法重构它,让它读起来连贯一致,同时所有动作都被序列化?

另外,在Ruby的例子中,如果promises是这样链接的,那么它实际上可以很好地读出,因为我们不需要使用return来计算最后一个值。所以它读起来像waitOneCyclethenwaitOneCyclethen...它看起来相当优雅。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-08 02:39:58

你不需要嵌套(而且只有当你return内在的承诺时它才会起作用),你也可以链接它:

代码语言:javascript
运行
复制
waitOneCycle()
  .then(() => {
    // do something
  })
  .then(waitOneCycle)
  .then(() => {
    // do something
  })
  .then(waitOneCycle)
  .then(() => {
    // do something
  })
  .then(waitOneCycle);

如果让waitOneCycle传递该值,这可能会工作得更好:

代码语言:javascript
运行
复制
const waitOneCycle = (v) => {
  return new Promise(resolve => setTimeout(resolve, v));
};

当然,如果您希望promise代码能够连贯地读取并且没有嵌套(甚至连then回调都没有),那么就应该使用async/await语法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63305779

复制
相关文章

相似问题

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