A()函数在1000
毫秒后返回promise,并引发错误。因此,下一次执行应放入catch
中。但是,即使主函数抛出错误,.then()
函数也会被执行。
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)
}
'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尝试重现问题。
答案 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);