【问题标题】:How can I traverse an promise object reference chain synchronously in a loop如何在循环中同步遍历 promise 对象引用链
【发布时间】:2017-06-18 21:25:30
【问题描述】:

我有一个方法可以从数据库异步返回一个对象的承诺(通过 id)。

function getObj(id){}....返回对象的承诺

它可能会或可能不会通过存储其 id 来引用另一个对象。

object.nextObjId

我需要遍历引用链,直到找到使用此方法的终端对象。显然,我必须等待承诺解决,然后才能检查下一个参考。

在同步代码中它看起来像这样:

function getTerminalObj(id)
{
    var obj = getObj(id);
    while(obj.nextRef)
    {
       obj = getObj(obj.nextObjId);
    }

    return obj;
}

当 getObj(id) 返回一个对象的承诺时,我该怎么做?

【问题讨论】:

  • 你检查过这个link吗?

标签: javascript node.js


【解决方案1】:

如果我错了,请纠正我。我认为您在问“如何以同步方式解决承诺”。 在 JS/NodeJS 的上下文中,有几个选项:

ES6: Co.js / Generators

ES7: await/async Async Functions

这两种方法都需要您:

  • 有一个相对较新的 JS 实现版本。
  • 使用 babel 将 ES6/ES7 代码转换为旧的 ES5 代码。

但是,我想说您不必以同步方式执行此操作。以下代码可能会有所帮助:

function chain(obj) {
  if (obj.nextRef) {
    return getObj(obj.nextObjId).then(chain);
  }
  return Promise.resolve(obj);
}

getObj(id).then(chain).then(function(terminalObj) {
  // There is the terminal object.
  console.log(terminalObj);
});

【讨论】:

  • 不幸的是,我现在不能使用 ES5 以上的任何东西。
  • "当使用 node 0.10.x 及更低版本或不支持生成器的浏览器时,您必须使用 gnode 和/或 regenerator。"来自github.com/tj/co#platform-compatibility
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 2020-06-09
  • 2015-03-17
  • 2018-01-19
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多