Javascript 使用Async.parallel my参数';s的寿命为';t使用MongoDB在NodeJS中超过异步调用

Javascript 使用Async.parallel my参数';s的寿命为';t使用MongoDB在NodeJS中超过异步调用,javascript,node.js,mongodb,express,asynchronous,Javascript,Node.js,Mongodb,Express,Asynchronous,由于下面的代码是异步的,“recipeData”数组的生命周期不足以持续异步回调,因此我在全局数组中复制了数据,但仍然收到相同的错误“TypeError:Cannot read property'\u id'of undefined”。代码如下: var tempArray; function getAllRecipes( db, callback ) { query( db, {}, 'recipes', function( err, recipeData ) {

由于下面的代码是异步的,“recipeData”数组的生命周期不足以持续异步回调,因此我在全局数组中复制了数据,但仍然收到相同的错误“TypeError:Cannot read property'\u id'of undefined”。代码如下:

var tempArray;

function getAllRecipes( db, callback )
{
    query( db, {}, 'recipes', function( err, recipeData )
    {
        tempArray = recipeData.slice();

        if( err || !tempArray.length )
            callback( err );
        else
        {
            var taskArr = [];

            for( var i=0; i < tempArray.length; i++ )
            {               
                taskArr.push( function( iCallback )
                {
                    getRecipeNotes( db, tempArray[ i ]._id, function( err2, noteData )
                    {
                        if( err2 )
                            iCallback( err2 );

                        tempArray[ i ].notes = noteData;
                        iCallback();
                    });
                });
            }

            taskArr.push( function( err3 )
            {
                callback( err3, tempArray );
            });

            async.parallel( taskArr );
        }
    });
}
var-tempArray;
函数getAllRecipes(db,回调)
{
查询(db,{},'recipes',函数(err,recipeData)
{
tempArray=recipeData.slice();
if(err | |!tempArray.length)
回调(err);
其他的
{
var taskArr=[];
对于(var i=0;i
调用“GetRecipeNodes”时出错

有人能帮我找出哪里出了问题吗


谢谢。

另一个选择是使用let i代替var i。不过,它是一个较新的功能(由ES6标准化,去年发布),并且在浏览器支持方面有一些限制乔纳森·洛诺夫斯基2天前


如果“使用strict”,则节点4.x及更高版本支持let;同样(这是V8目前强加的临时限制)。如果您使用的是较低版本(0.12.x等),则--harmony命令行标志可能会启用它Jonathan Lonowski 2天前

–因为
getRecipeNotes()
是异步的,所以
for
循环能够在调用任何回调之前继续修改
i
(使用
i++
)。当它们出现时,
i==tempArray.length
,循环结束的条件。使用闭包,您可以为每个回调提供自己的
i
来处理并记住循环中的每个值。噢,哇,这一点非常明显,现在您已经指出了另一个选项是使用
var i
。虽然它是一个较新的特性(由ES6标准化,去年发布),并且有一些限制。let在Node.js中不受支持,但它可以使用闭包。我会检查并张贴答案,如果它确实有效。感谢您提供的帮助
let
Node 4.x及更高版本(这是V8当前施加的临时限制)。如果您使用的是较低版本(
0.12.x
,等等),
--harmony
命令行标志可能会启用它。