【发布时间】:2019-01-10 03:23:22
【问题描述】:
A() 函数在1000 ms 之后返回承诺并抛出错误。所以,下一次执行应该进入catch。但是,.then() 函数即使在 main 函数抛出错误后也会执行。
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 重现问题。
【问题讨论】:
-
因为
AInner没有返回一个promise?,它返回了undefined,链接受一个有效值来继续链。我可能错了。 -
@kiddorails AInner 返回
callback function,我已经处理了返回的callback function以使用Q.nfcall转换为promise。这不是问题,因为如果是这样,它将在未完成执行的情况下引发错误。 -
想通了。更改为
.then(() => Test1.B(value, value1)),您正在调用Test1.B,而不是提供回调。 -
“按照 then 的顺序而不是 then 的顺序编写代码。”是什么意思?
-
@Bergi 我的意思是我想编写类似
A.then(B).then(C).catch(function(e){})的代码,其中A,B and C是函数。