【问题标题】:node async library: converting a promise structure with callbacks节点异步库:使用回调转换承诺结构
【发布时间】:2023-04-02 19:15:01
【问题描述】:

我有以下代码块:

new Promise((res, rej) => {
  if (checkCondition()) {
    res(getValue())
  } else {
    getValueAsync((result) => {
      res(result)
    })
  }
}).then((value) => {
  doStuff(value)
})

我想使用 async 库,这是代码库的其余部分使用的。我试图找出哪个功能最能解决这个问题。我只能想出一个解决方案,但似乎有点笨拙:

async.tryEach([
  (cb) => {
    if (checkCondition()) {
      cb (null, getValue())
    } else {
      cb (1)
    }
  },
  (cb) => {
    if (!checkCondition()) {
      getValueAsync((result) => {
        cb(null, result)
      })
    } else {
      cb (1)
    }
  }],
  (err, value) => {
    doStuff(value)
  }
)

就像我说的,这感觉很笨重。很高兴它异步运行检查,我很确定它总能得到正确的结果,但代码块现在更大更混乱。

我在这里的唯一目的是使用与代码库的其余部分相同的库和技术,它们根本不使用 Promise。我无法在任何地方找到类似的控制流块,这就是我需要自己构建它的原因。如果我坚持承诺,那就这样吧,但我想使用该库找到解决方案。

【问题讨论】:

  • 我不熟悉那个库,但我可以建议 node 8 async/await 吗?看起来它比您的代码示例要干净得多。
  • See my previous question。另外,我后来发现该服务正在运行 node6,所以 async/await 不是一个开始的选项

标签: javascript node.js asynchronous


【解决方案1】:

我想你可能想多了。

异步库旨在与 Node.js 样式的异步代码一起使用。每the docs

所有这些函数都假定您遵循 Node.js 约定,即提供单个回调作为异步函数的最后一个参数——一个回调,它需要一个错误作为它的第一个参数——并调用一次回调。

因此,您的 Promise 代码的异步样式版本如下所示:

function myThing(cb) {
  if (checkCondition()) {
    cb(null, getValue());
  } else {
    getValueAsync(result => cb(null, result));
  }
}

myThing((err, res) => doStuff(res));

你会注意到这看起来很像你原来的承诺代码。

由于myThing 接受 Node.js 样式的回调函数作为其最后一个参数,您现在可以将它与任何异步库的函数一起使用,例如:

async.series(
  [ myThing, myThing, myThing ],
  (err, res) => doStuff(res)
);

您可以在下面的 sn-p 中看到一个工作示例。

const condition = false;
const checkCondition = () => condition;
const getValue = () => 123;
const getValueAsync = cb => setTimeout(() => cb(getValue()), 250);
const doStuff = value => console.log('doStuff', value);

function myThing(cb) {
  if (checkCondition()) {
    cb(null, getValue());
  } else {
    getValueAsync(result => cb(null, result));
  }
}

myThing((err, res) => doStuff(res));

async.series(
  [ myThing, myThing, myThing ],
  (err, res) => doStuff(res)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/async/2.6.0/async.min.js"></script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多