代码之家  ›  专栏  ›  技术社区  ›  Hardik Shah

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

  •  1
  • Hardik Shah  · 技术社区  · 8 年前

    函数返回承诺 1000 然后抛出一个错误。所以,下一次执行应该是 catch . 但是, .then() 即使在主函数抛出错误之后,函数也会被执行。

    测试.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)
      }
    

    测试1.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 而不是低于 然后 .

    你可以在这里试试 https://repl.it/@hrdk108/Hardik-Shah-Issue1 复制一个问题。

    2 回复  |  直到 8 年前
        1
  •  0
  •   kiddorails    8 年前

    问题是,您正在调用 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)
      }
    
        2
  •  0
  •   Hardik Shah    8 年前

    经过长时间的头脑风暴,我终于明白了,这只是一个愚蠢的错误。

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


    第二种解决方案:


    正确的书写方式 然后 顺序是:

    Test1.B 不带参数的函数:


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

    测试1.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 您应该注意传递参数设计。

    • NFLAK 需要单独提供参数

    例如:

    Q.nfcall(B, value, value1);
    
    推荐文章