Javascript 使用Async.parallel my参数';s的寿命为';t使用MongoDB在NodeJS中超过异步调用
由于下面的代码是异步的,“recipeData”数组的生命周期不足以持续异步回调,因此我在全局数组中复制了数据,但仍然收到相同的错误“TypeError:Cannot read property'\u id'of undefined”。代码如下: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 ) {
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
命令行标志可能会启用它。