gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:29 25 4
gpt4 key购买 nike

A() 函数在 1000 毫秒后返回 promise 并抛出错误。因此,下一次执行应该进入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)
}

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),而不是将其保留为回调。因为,一旦您将它用作调用,它就会启动自己的 promise 链。要修复它,请将其更改为:

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

关于node.js - .then() 函数在主函数完成之前被调用 - Q.nfcall,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51652195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com