Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将对象返回到node.js中的async.each函数中_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 将对象返回到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

我想了解node.js中异步模块的一点

我创建了一个函数,它将一个对象从一个窗体映射到一个模型对象,并返回这个对象。 此对象是一个带有标记数组的视频

我的问题是我在哪里可以归还视频?我知道它通常在异步回调函数中,但如果我这样做,则返回的对象是未定义的。 然而,如果我在整个函数的末尾返回视频对象,它可以工作,但不安全,因为我不确定,我的异步完成了

顺便说一句,我不理解传入async.each和的参数中的回调函数 在
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
?我真的认为你想要一个同步的