gpt4 book ai didi

javascript - 从模块函数返回的对象未定义

转载 作者:行者123 更新时间:2023-11-28 19:20:18 24 4
gpt4 key购买 nike

这一定是我不熟悉的范围问题。我有一个小模块,如下所示:

(function () {

var getPlanInfo = function (id, conn) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) console.error('Query error: ' + error.stack);

console.log(result[0]); // Everything is great

return result[0];
});
};

modules.exports.getPlanInfo = function (id, conn) { return getPlanInfo(id, conn); // Typo }

})();

问题来了。当我从任何地方(模块本身或另一个文件内)调用它时,返回值始终是未定义的。我从函数内部检查,查询返回了预期的结果。

var backend = require('./module.js');
var t = backend.getPlanInfo();

t 是未定义。如果我从模块本身内部调用该方法(该模块中的另一个函数),情况是相同的。

我熟悉 javascript 中的回调原理以及如何将对象和函数作为参数传递以保持在范围内。这是这里的问题还是node.js 的特殊性?

我在开发者控制台 (Chrome) 中尝试过,按预期工作。

最佳答案

conn.query() 看起来像是异步的。因此,您无法从 getPlanInfo() 返回其结果,因为 getPlanInfo() 早在结果可用之前就返回了。从 conn.query() 回调返回 result[0] 只是将一段数据返回到 conn.query() 基础设施中。 getPlanInfo() 早已返回。

如果您想要异步结果,则必须更改 getPlanInfo() 以使用支持获取异步结果的机制,例如直接回调或 promise 或类似的东西。

这是一个简单的回调方式:

var getPlanInfo = function (id, conn, callback) {
conn.query('SELECT * FROM `items` WHERE `id` = ?', [id], function (error, result) {
if (error) {
console.error('Query error: ' + error.stack);
callback(error);
return;
}

console.log(result[0]); // Everything is great

callback(0, result[0]);
});
};

modules.exports.getPlanInfo = getPlanInfo;

然后,该模块的调用者将如下所示:

var m = require('whatever');
m.getPlanInfo(id, conn, function(err, result) {
if (err) {
// error here
} else {
// process result here
}
});

关于javascript - 从模块函数返回的对象未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29021340/

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