gpt4 book ai didi

javascript - NodeJS 回调范围问题

转载 作者:搜寻专家 更新时间:2023-11-01 00:11:13 25 4
gpt4 key购买 nike

我是 Node.js 的新手(本周刚开始),有一个基本部分我无法理解。我有一个辅助函数,可以调用 MySQL 数据库来获取一些信息。然后我使用回调函数将该数据返回给调用者,这工作正常但是当我想在该回调之外使用该数据时我遇到了麻烦。这是代码:

    /** Helper Function **/
function getCompanyId(token, callback) {
var query = db.query('SELECT * FROM companies WHERE token = ?', token, function(err, result) {
var count = Object.keys(result).length;

if(count == 0) {
return;
} else {
callback(null, result[0].api_id);
}
});
}

/*** Function which uses the data from the helper function ***/
api.post('/alert', function(request, response) {
var data = JSON.parse(request.body.data);
var token = data.token;

getCompanyId(token, function(err, result) {
// this works
console.log(result);
});

// the problem is that I need result here so that I can use it else where in this function.
});

如您所见,只要我在回调范围内,我就可以访问 getCompanyId() 的返回值,但我需要在回调之外使用该值。我能够通过将所有逻辑粘贴到该回调中来在另一个函数中解决这个问题,但在这种情况下不起作用。任何关于如何更好地构建它的见解将不胜感激。到目前为止,我真的很喜欢 Node.js,但显然我很多需要学习。

最佳答案

简短的回答 - 你不能在不违反 Node.js 的异步特性的情况下这样做。

想想尝试在回调之外访问 result 的后果 - 如果您需要使用该值,而回调尚未运行,您会怎么做?您不能 sleep 并等待设置值 - 这与 Node 的单线程、事件驱动设计不兼容。在等待回调运行时,您的整个程序将不得不停止执行。

任何依赖于 result 的代码都应该在 getCompanyId 回调中:

api.post('/alert', function(request, response) {
var data = JSON.parse(request.body.data);
var token = data.token;

getCompanyId(token, function(err, result) {
//Any logic that depends on result has to be nested in here
});
});

学习 Node.js(异步编程很普遍)最困难的部分之一是学习异步思考。一开始可能会很困难,但值得坚持。您可以尝试按程序进行战斗和编码,但这将不可避免地导致难以维护的复杂代码。

如果您不喜欢多重嵌套回调的想法,您可以查看promises,它让您可以将方法链接在一起而不是嵌套它们。 This article是对 Q 的一个很好的介绍,它是 promises 的一种实现。

关于javascript - NodeJS 回调范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20410153/

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