gpt4 book ai didi

javascript - Node.js - 函数调用返回未定义并稍后评估

转载 作者:行者123 更新时间:2023-12-02 16:22:58 25 4
gpt4 key购买 nike

我正在使用 async 模块并行执行一组函数。但是,我在这些函数的回调中使用另一个函数的返回值。但问题是,函数返回未定义,因为回调不等待它被评估。

function getGenresId(genres){
var genresArr = parseCSV(genres);
Genre.find({name: {$in: genresArr } }, function (err, genres) {
var genresId = genres.map(function (genre) {
return genre.id;
});
return genresId.toString();
});

}

async.parallel({
getGenres: function (callback) {
if(checkempty(req.query.genres) === true){
callback(null, getGenresId(req.query.genres)});
}
else{
callback(null, '');
}

},
getActor: function (outercallback) {
if(checkempty(req.query.actors) === true) {
//other code here
}
else{
outercallback(null, '');
}
}
);

我确实知道函数 getGenresId() 包含对数据库的阻塞调用,Node.js 将异步处理它。但有什么办法可以强制

callback(null, getGenresId(req.query.genres)});

评估 getGenresId 函数并等待其返回值,然后再继续。我可以在这里使用 async 的系列函数,但是有没有一种 native /更好的方法来做到这一点?

最佳答案

问题在于以下假设:

I do understand that the function getGenresId() contains a blocking call to the database

...因为 getGenresId 根本没有阻塞。它立即返回 undefined (第 9 行),然后最终在数据库上运行查询。它不会阻止任何其他内容的运行,因此它是非阻塞

您能否将数据库调用更改为阻塞?有点(async-await生成器),但不用担心,因为您已经可以使用现有代码了。只需要稍加改动即可工作:

// This function has a new argument, one named 'callback'.
function getGenresId(genres, callback){
var genresArr = parseCSV(genres);
Genre.find({name: {$in: genresArr } }, function (err, genres) {
if(err) {
callback(err);
return; // Stop processing the rest of the function.
}
var genresId = genres.map(function (genre) {
return genre.id;
});
// Instead of the `return` statement, we call the callback.
callback(null, genresId.toString());
});

}

async.parallel({
getGenres: function (callback) {
if(checkempty(req.query.genres) === true){
// Call the function by passing the list of
// genres & this function's callback.
// Functions are ordinary values.
getGenresId(req.query.genres, callback);
}
else{
callback(null, '');
}

},
...

看看如何仅在数据库结果输入后调用callback(传递给getGenresId函数)?这就是这样做的方法。您所拥有的 return 语句的值 (return类型Id.toString();),因为它位于非阻塞异步函数(数据库调用)内,因此被丢弃。

其他选项( promise 、生成器等)也是有效的方法,但您已经使用的 async 模块没有任何问题。

关于javascript - Node.js - 函数调用返回未定义并稍后评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28940040/

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