使方法在node.js中返回与Bluebird的伪承诺的正确方法是什么

时间:2016-01-27 18:35:23

标签: javascript node.js promise bluebird

所以,我有一个像这样的承诺链的函数:

Myclass.Prototype.initAsync = function() {
  someFunctionAsync(params).bind(this)
    .then(function(data) {
      processData(data);
      return someOtherFunctionAsync(params).bind(this);
    })
    .then(function(data) {
      processData(data);
      return yetAnotherFunctionAsync(params).bind(this);
    })
    .finally(function(data) {
      processData(data);
    });
 }

它有效,但我希望这个功能本身能够成为一系列承诺。通常,我只是摆脱了#34;最后"最后,但我不希望调用者负责调用processData。我希望能够像这样调用这个函数:

setupFunctionAsync(params).bind(this)
  .then(function(data) {
    processSetup();
    return initAsync();
  })
  .finally(function(data) {
    runProgram();
  });

在"最后" initAsync,做什么是正确的?我想用Promise.new创建一个新的空承诺并返回吗?或者我想使用一个空方法使用Promise.method?或者有更好的方法吗?

现在我正在做以下事情,但我想知道这是否是最好的事情:

return someFunctionAsync(params).bind(this)
   .then(function(data) {
...
   .then(function(data) {
     processData(data);
     return new Promise(function(resolve, reject) { resolve(); });
   });

最新更新:

阅读完一些答案后,这会有效吗?

Myclass.Prototype.initAsync = function() {
  return someFunctionAsync(params).bind(this)
    .then(function(data) {
      processData(data);
      return someOtherFunctionAsync(params).bind(this);
    })
    .then(function(data) {
      processData(data);
      return yetAnotherFunctionAsync(params).bind(this);
    })
    .then(function(data) {
      processData(data);
    });
  }

,它被称为:

this.initAsync()
  .then(function() {
    runProgram();
  });

请注意,我没有"返回"在initAsync的最后一个。那可以吗?

1 个答案:

答案 0 :(得分:3)

我认为你误解了finally。在任何情况下都会调用传递给finally的函数,这意味着在解析promise和拒绝promise时。 finally还返回另一个promise(具有前一个promise的值),因此链接没问题。

看起来很像你应该使用then并且你只使用finally因为它似乎非常适合这个过程的最后一步。你可以在这里使用then

无论如何,由于finally已经返回一个承诺,您只需在函数开头添加return即可。你不需要一个假的承诺"。

在最后then传递的函数中没有返回语句不是问题。它只是意味着没有值传递给then之后链接的下一个承诺。但是,无论如何它都会被调用。您添加到问题中的代码看起来很好。