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

时间:2018-08-02 11:11:29

标签: node.js promise q

A()函数在1000毫秒后返回promise,并引发错误。因此,下一次执行应放入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尝试重现问题。

2 个答案:

答案 0 :(得分:0)

问题是,您正在Test1.B(value, value1)内调用then,而不是将其保留为回调。因为,一旦将其用作调用,它便启动了它自己的承诺链。要对其进行修复,请将其更改为:

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)
  }

答案 1 :(得分:0)

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

  • 这个错误只是因为我在定义时调用了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 需要单独提供的参数
  •   
     

例如:

Q.nfcall(B, value, value1);