.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);
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);