【问题标题】:Can promises be relayed in node可以在节点中中继承诺吗
【发布时间】:2016-08-14 13:41:05
【问题描述】:

我有以下要求,我有三个异步函数 async1()、async2()、ascync3(),它们都返回承诺 现在我将调用一个函数并分别串行执行 async1、async2、async3,我想打印在 async3 之后返回的已解析承诺

这是我的主要功能

testPromiseSerially = function() {
  return new promise(function(resolve,reject) {
   async1().
   then(function(result1) {
    return async2(result1)
   })
   .then(function(result2){
     return async3(result2)
   })
   .catch(function(err) {
     return reject(err) 
   }
 })
}

这是我的 async3 函数

async3 = function(params) {
 return new promise(function(resolve,reject) {
   return resolve("solved")
})
}

而且async1和async2也和async3类似

如果我执行这段代码

testPromiseSerially.then(function(result) {
  console.log(result)
})
.catch(function (err) {
 console.log(err) 
})

testPromiseSerially 被调用,但没有输入“then”或“catch” block.async3 返回的 promise 是否没有转发回 testpromiseSerially()? 如何查看 async3 的结果? 我知道如果我扩展我的代码,比如添加

.then(function(result) {
  return resolve(result)
})

在 async3(result) 之后,我就能看到结果了。但是我有一系列函数依赖于其他函数返回的承诺,那么我该如何处理呢?

【问题讨论】:

标签: javascript node.js asynchronous promise q


【解决方案1】:

您应该使用异步https://github.com/caolan/async。这对你的情况更好。看看瀑布函数。

来自文档

瀑布(任务,[回调]) 连续运行任务数组,每个函数将其结果传递给数组中的下一个。但是,如果任何任务将错误传递给它们自己的回调,则不会执行下一个函数,并且会立即调用带有错误的主回调。

【讨论】:

    【解决方案2】:

    主要问题是您的testPromiseSerially 代码永远不会调用resolve。所以它返回的承诺永远不会被解决。

    因为它正在测试的东西已经有承诺,所以你没有必要创建一个新的。每次调用 then 都会产生一个新的 Promise,所以就使用它吧。

    另外,这个:

    .then(function(result1) {
        return async2(result1);
    })
    

    比你需要的更复杂/冗长,它可以是:

    .then(async2)
    

    .catch 也是如此。

    所以:

    let testPromiseSerially = function() {
      return async1()
          .then(async2)
          .then(async3);
    };
    

    Example using JavaScript's native promises on Babel's REPL

    【讨论】:

    • 感谢您的回复,但在这种情况下 async2() 取决于 async1() 的结果,所以我使用了代码 .then(function(result1) { return async2(result1); }) .如果我使用与您上面提到的相同的代码,是否会使用 async1() 的结果调用 async2()?
    • @Shakthi:是的,出于同样的原因,.then(function(result1) { }) 的调用结果为async1。在这两种情况下,您都将函数引用传递给then,并且在这两种情况下,promise 都会调用您传递的函数,并使用 promise 的确定值。我已经更新了 Babel REPL 示例中的代码来证明这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2011-03-04
    • 2014-06-04
    • 2016-05-17
    相关资源
    最近更新 更多