【问题标题】:Converting node async code to promises将节点异步代码转换为 Promise
【发布时间】:2013-07-01 11:13:17
【问题描述】:

我正在试验 promises - 即 when.js - 并且想要转换一些测试代码 - 即使在阅读文档之后也不清楚如何去做。到目前为止,我的实验比标准回调金字塔要混乱得多,所以我认为我缺少一些捷径。

这是我想复制的示例代码:

Async1(function(err, res) {
  res++;
  Async2(res, function(error, result) {
    done();
  })
})

【问题讨论】:

  • 您在制定Async1().then(function(res){return Async2(res+1)}).then(done) 或调整Async 函数时遇到问题吗?然后你需要向我们展示他们的代码……
  • 我有 nodefn.call(Async2, nodefn.call(Async1)).ensure(done);但不确定我会在哪里做 res++ - 它实际上只是一个占位符 - 我想在 2 个调用之间执行一些逻辑

标签: javascript node.js promise when-js


【解决方案1】:
nodefn.call(Async2, nodefn.call(Async1)).ensure(done);

在这里,Async2 实际上是同步调用的,并且以 Async1() 的 Promise 作为参数 - 它不会等待 Async1 解决。要链接它们,您需要使用

nodefn.call(Async1).then(nodefn.lift(Async2)).ensure(done);
// which is equivalent to:
nodefn.call(Async1).then(function(result) {
    return nodefn.call(Async2, result);
}).ensure(done);

我想在两次调用之间执行一些逻辑

那么你需要在链中加入另一个函数,或者修改链中的一个函数:

nodefn.call(Async1)
  .then(function(res){return res+1;}) // return modified result
  .then(nodefn.lift(Async2))
  .ensure(done);
// or just
nodefn.call(Async1).then(function(res) {
    res++; // do whatever you want
    return nodefn.call(Async2, res);
}).ensure(done);

【讨论】:

    【解决方案2】:

    不确定何时,但使用 Deferred 库,您可以这样做:

    // One time configuration of promise versions
    async1 = promisify(async1);
    async2 = promisify(async2);
    
    // construct flow
    async1().then(function (res) { return async2(++res); }).done();
    

    【讨论】:

      猜你喜欢
      • 2015-10-24
      • 2015-04-15
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多