- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!