Javascript 将对象返回到node.js中的async.each函数中
我想了解node.js中异步模块的一点 我创建了一个函数,它将一个对象从一个窗体映射到一个模型对象,并返回这个对象。 此对象是一个带有标记数组的视频 我的问题是我在哪里可以归还视频?我知道它通常在异步回调函数中,但如果我这样做,则返回的对象是未定义的。 然而,如果我在整个函数的末尾返回视频对象,它可以工作,但不安全,因为我不确定,我的异步完成了 顺便说一句,我不理解传入async.each和的参数中的回调函数 在Javascript 将对象返回到node.js中的async.each函数中,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我想了解node.js中异步模块的一点 我创建了一个函数,它将一个对象从一个窗体映射到一个模型对象,并返回这个对象。 此对象是一个带有标记数组的视频 我的问题是我在哪里可以归还视频?我知道它通常在异步回调函数中,但如果我这样做,则返回的对象是未定义的。 然而,如果我在整个函数的末尾返回视频对象,它可以工作,但不安全,因为我不确定,我的异步完成了 顺便说一句,我不理解传入async.each和的参数中的回调函数 在video.products.push(标签)之后调用。这个函数做什么 问候 在my
video.products.push(标签)之后调用代码>。这个函数做什么
问候
在my mapping.js中:
exports.video = function(object) {
var video = new Video();
video.name = object.name;
video.products = [];
async.each(object.tags, function(tago, callback) {
tag = {
"name" : tago.name
}
video.products.push(tag);
callback();
} ,
function(err) {
if( err ) {
console.log('Error' + error);
throw err;
}
logger.debug("into async" + video);
}
);
logger.debug("end function " );
**//return video;**
}
var video = mapping.video(object);
logger.debug(video); // return undefined
在my video.js中:
exports.video = function(object) {
var video = new Video();
video.name = object.name;
video.products = [];
async.each(object.tags, function(tago, callback) {
tag = {
"name" : tago.name
}
video.products.push(tag);
callback();
} ,
function(err) {
if( err ) {
console.log('Error' + error);
throw err;
}
logger.debug("into async" + video);
}
);
logger.debug("end function " );
**//return video;**
}
var video = mapping.video(object);
logger.debug(video); // return undefined
简单的答案是你不能——至少不能通过简单或明显的方法。顾名思义,async是一个用于将异步函数调用排队到事件循环中的库。因此,exports.video函数只是启动一组异步函数,这些函数在不可预测的时间范围内一个接一个地执行,然后立即返回。无论您尝试在异步实例化的函数调用范围内返回视频对象,exports.video函数都已返回
在这种情况下,似乎并不需要异步函数调用。我建议您使用类似下划线的each方法来代替async,它是同步执行的
简单的答案是你不能——至少不能通过简单或明显的方法。顾名思义,async是一个用于将异步函数调用排队到事件循环中的库。因此,exports.video函数只是启动一组异步函数,这些函数在不可预测的时间范围内一个接一个地执行,然后立即返回。无论您尝试在异步实例化的函数调用范围内返回视频对象,exports.video函数都已返回
在这种情况下,似乎并不需要异步函数调用。我建议您使用类似下划线的each方法来代替async,它是同步执行的
您需要为导出定义回调。视频功能例如
exports.video = function(object, callback) {
// video code (snip)...
async.each(object.tags,
function eachTag(tag, done) {
// code run for each tag object (snip)...
done();
},
function finished(err) {
// code run at the end (snip)...
callback(thingThatsReturned);
});
};
…并这样称呼它:
var videoUtils = require('videoUtils');
var tags = getTags();
videoUtils.video({ tags: tags }, function(thingThatsReturned) {
// do something with 'thingThatsReturned'
});
顺便说一下,我不理解传入的回调函数
参数,并在video.products.push(标记)之后调用。
这个函数做什么
async.each函数将为数组中的每个项调用上面的“eachTag”函数(第2个参数)。但由于它是异步完成的,并且您可能在函数中执行其他异步操作(点击数据库/api等),因此它需要知道特定数组项的函数何时完成。调用done()告诉async.each函数已完成处理。一旦所有函数都完成了处理(它们都调用了done()),async.each将运行上面的'finished'函数(第三个参数)
对于Node.js来说,这是非常标准的异步内容,但一开始要想了解这一点可能很困难。坚持住:-)
编辑:看起来您的代码没有执行任何异步操作。如果是,那么上面的代码就是实现它的方法,否则下面的代码会工作得更好:
exports.video = function(object) {
// video code (snip)...
if (Array.isArray(object.tags)) {
object.tags.forEach(function eachTag(tag) {
// code run for each tag object (snip)...
});
}
return thingThatsReturned;
};
…并称之为
var videoUtils = require('videoUtils');
var tags = getTags();
var thingThatsReturned = videoUtils.video({ tags: tags });
您需要为导出定义回调。视频函数例如
exports.video = function(object, callback) {
// video code (snip)...
async.each(object.tags,
function eachTag(tag, done) {
// code run for each tag object (snip)...
done();
},
function finished(err) {
// code run at the end (snip)...
callback(thingThatsReturned);
});
};
…并这样称呼它:
var videoUtils = require('videoUtils');
var tags = getTags();
videoUtils.video({ tags: tags }, function(thingThatsReturned) {
// do something with 'thingThatsReturned'
});
顺便说一下,我不理解传入的回调函数
参数,并在video.products.push(标记)之后调用。
这个函数做什么
async.each函数将为数组中的每个项调用上面的“eachTag”函数(第2个参数)。但由于它是异步完成的,并且您可能在函数中执行其他异步操作(点击数据库/api等),因此它需要知道特定数组项的函数何时完成。调用done()告诉async.each函数已完成处理。一旦所有函数都完成了处理(它们都调用了done()),async.each将运行上面的'finished'函数(第三个参数)
对于Node.js来说,这是非常标准的异步内容,但一开始要想了解这一点可能很困难。坚持住:-)
编辑:看起来您的代码没有执行任何异步操作。如果是,那么上面的代码就是实现它的方法,否则下面的代码会工作得更好:
exports.video = function(object) {
// video code (snip)...
if (Array.isArray(object.tags)) {
object.tags.forEach(function eachTag(tag) {
// code run for each tag object (snip)...
});
}
return thingThatsReturned;
};
…并称之为
var videoUtils = require('videoUtils');
var tags = getTags();
var thingThatsReturned = videoUtils.video({ tags: tags });
当回调函数完全不是异步的时候,为什么要使用async
?我真的认为您需要一个同步的回调函数,为什么在回调函数根本不是异步的情况下使用async
?我真的认为你想要一个同步的