在 NodeJS 中执行 For 之后回调的最佳方式?
The best way to do a Callback after For in NodeJS?
我已经在 PHP 开发多年,现在我正在尝试学习 NodeJS,但我在使用异步函数时遇到了问题...
我在 NodeJS 中有这个函数(源是一个用户数组):
//userformat.js
var age = module.exports.age = function(date){
var diff = new Date - new Date(date);
var diffdays = diff / 1000 / (60 * 60 * 24);
var age = Math.floor(diffdays / 365.25);
return age;
}
...etc.
//index.js
function format(source, me, callback){
var len = source.length
for (var i = 0; i < len; i++){
source[i]['_age'] = userFormat.age(source[i]['birthday']);
source[i]['_rating'] = userFormat.rating(source[i]['votes']);
source[i]['_is_followed'] = userFormat.followed(source[i]['fllws'], me);
}
callback(null, source);
}
我知道该函数在 Node 中是 错误的 ,因为该函数可能在 for() 中的函数完成之前调用回调,并且数组中的值可能未定义,因此我使用回调更改了函数:
//userformat.js
var age = module.exports.age = function(date, callback){
var diff = new Date - new Date(date);
var diffdays = diff / 1000 / (60 * 60 * 24);
var age = Math.floor(diffdays / 365.25);
callback(age);
}
...etc.
//index.js
function format(source, me, callback){
var len = source.length
for (var i = 0; i < len; i++){
userFormat.age(source[i]['birthday'], function(resul){
source[i]['_age'] = resul;
userFormat.rating(source[i]['votes'], function(resul){
source[i]['_rating'] = resul;
userFormat.followed(source[i]['fllws'], me, function(resul){
source[i]['_is_followed'] = resul;
//Callback
if (i == len-1){
callback(null, source);
}
})
})
})
}
}
正确吗?我有另一种更高效或更优雅的方法吗?
非常感谢!
我认为你误解了nodeJS中异步的概念。您的代码不是异步的,您的回调将始终在循环后调用。
检查这个问题:how do i create a non-blocking asynchronous function in node.js?
我已经在 PHP 开发多年,现在我正在尝试学习 NodeJS,但我在使用异步函数时遇到了问题...
我在 NodeJS 中有这个函数(源是一个用户数组):
//userformat.js
var age = module.exports.age = function(date){
var diff = new Date - new Date(date);
var diffdays = diff / 1000 / (60 * 60 * 24);
var age = Math.floor(diffdays / 365.25);
return age;
}
...etc.
//index.js
function format(source, me, callback){
var len = source.length
for (var i = 0; i < len; i++){
source[i]['_age'] = userFormat.age(source[i]['birthday']);
source[i]['_rating'] = userFormat.rating(source[i]['votes']);
source[i]['_is_followed'] = userFormat.followed(source[i]['fllws'], me);
}
callback(null, source);
}
我知道该函数在 Node 中是 错误的 ,因为该函数可能在 for() 中的函数完成之前调用回调,并且数组中的值可能未定义,因此我使用回调更改了函数:
//userformat.js
var age = module.exports.age = function(date, callback){
var diff = new Date - new Date(date);
var diffdays = diff / 1000 / (60 * 60 * 24);
var age = Math.floor(diffdays / 365.25);
callback(age);
}
...etc.
//index.js
function format(source, me, callback){
var len = source.length
for (var i = 0; i < len; i++){
userFormat.age(source[i]['birthday'], function(resul){
source[i]['_age'] = resul;
userFormat.rating(source[i]['votes'], function(resul){
source[i]['_rating'] = resul;
userFormat.followed(source[i]['fllws'], me, function(resul){
source[i]['_is_followed'] = resul;
//Callback
if (i == len-1){
callback(null, source);
}
})
})
})
}
}
正确吗?我有另一种更高效或更优雅的方法吗?
非常感谢!
我认为你误解了nodeJS中异步的概念。您的代码不是异步的,您的回调将始终在循环后调用。
检查这个问题:how do i create a non-blocking asynchronous function in node.js?