.then() 函数在主函数完成之前被调用 - Q.nfcall

.then() function is called before main function gets completed - Q.nfcall

A() 函数 return 在 1000 毫秒后承诺并抛出错误。所以,下一次执行应该进入catch。但是,即使主函数抛出错误,.then() 函数仍会执行。

Test.js

var Test1 = require("./Test1.js")
var Q = require('q');
var value = "Hardik";
var value1 = "Shah";

A()
  .then(Test1.B(value, value1))
  .catch(function(e){
    console.log("In catch: ", e.message);
  });


  function A(){
    console.log("In A function");
    return Q.nfcall(AInner);
  }

  function AInner(callback){
    setTimeout(function() {
      callback({message: "Error from A Inner"});
    }, 1000)
  }

Test1.js

'use strict';

var Q = require("q");

module.exports = {B:B}

function B(value, value1){
  console.log("In B function: ", value, " ", value1);
  return Q.nfcall(BInner);
}

function BInner(callback){
  console.log("In BInner function");
  callback({message: "Error from BInner"});
}

实际输出:

In A function
In B function:  Hardik   Shah
In BInner function
In catch: Error from A Inner

预期输出:

In A function
Error from A Inner // After 1000 ms

我已经通过修改以下代码解决了问题:工作完美

A()
  .then(function(){
    return Test1.B(value, value1)
  }).then(function(data){
     console.log("final data", data);
  })
  .catch(function(e){
    console.log(e.message);
  });

但是,上面的代码有什么问题吗?

请给我一个很好的解释,在 then 的顺序而不是在 then.

的顺序下编写代码的正确方法

您可以在这里 https://repl.it/@hrdk108/Hardik-Shah-Issue1 尝试重现问题。

问题是,您在 then 中调用 Test1.B(value, value1),而不是将其保留为回调。因为,一旦你将它用作调用,它就开始了它自己的承诺链。要修复它,请将其更改为:

var Test1 = require("./Test1.js")
var Q = require('q');
var value = "Hardik";
var value1 = "Shah";

A()
  .then(function() { Test1.B(value, value1) }) // note here
  .catch(function(e){
    console.log("In catch: ", e.message);
  });


  function A(){
    console.log("In A function");
    return Q.nfcall(AInner);
  }

  function AInner(callback){
    setTimeout(function() {
      callback({message: "Error from A Inner"});
    }, 1000)
  }

经过长时间的头脑风暴,我想通了,这只是一个愚蠢的错误。

  • 那个错误是因为我在定义时调用了Test1.B() 进入 then。上面的答案已经回答了。所以,一个解决方案是我已经在问题中提到了。


第二种解法:


then序列的正确写法是:

Test1.B 不带参数的函数:


A()
  .then(Test1.B)
  .catch(function(e){
    console.log("In catch: ", e.message);
  });

Test1.B 带参数: 使用 bind

A()
  .then(Test1.B.bind(null, value, value1))
  .catch(function(e){
    console.log("In catch: ", e.message);
  });

在此处检查更正示例 https://repl.it/@hrdk108/Hardik-Shah-Issue1


仅供参考,

实际上,当您使用 Q.nfcall 时,您应该注意传递参数的设计。

  • nfcall expects arguments provided individually

For Example:

Q.nfcall(B, value, value1);