Node.js 等到异步函数完成,然后继续执行其余代码
Posted
技术标签:
【中文标题】Node.js 等到异步函数完成,然后继续执行其余代码【英文标题】:Node.js wait until async functions are complete, then continue with the rest of the code 【发布时间】:2016-10-29 17:42:42 【问题描述】:在我的代码中,我有 2 个 for 循环执行一个异步函数(这两个循环中的函数相同),但是在这 2 个循环之后,代码必须等到它们执行后才能运行。这是我的代码:
for(var a = 0; a < videoIds.length; a++)
if(videoIds)
findVideo(videoIds[a], function(thumbnailPath, videoName) // findVideo is the async function
// it returns 2 values, thumbnailPath and videoName
videoNames[a] = videoName; // and then these 2 values are written in the arrays
thumbnaildPaths[a] = thumbnailPath;
console.log('1');
);
// then the above code runs one more time but with different values, so I won't include it here (it's the same thing)
enter code here
console.log('3');
// the rest of the code
// writes the values from the loops to the database so I can't run it many times
如果我运行代码,我会在看到 1 之前看到 3(来自 console.log 函数)。但正如我上面所说,我必须等待循环结束才能继续。 findVideo()
函数只包含 mongoose 提供的 Video.find() 方法,然后返回值 thumbnailPath 和 videoName。我需要做的是等待 2 个循环结束然后继续,但是由于显而易见的原因,我不能将其余代码放在循环中!有没有什么办法解决这一问题?谢谢!
【问题讨论】:
该函数的循环在那里,只是为了确保某些选定的视频确实存在并且它们是由用户上传的(确切地说是req.user) 你可以看看async
npm 模块,用于管理异步控制流
使用承诺。他们是为此目的而存在的。 npmjs.com/package/promise
【参考方案1】:
你可以使用回调,但我更喜欢 promise,因为它们很优雅。
利用Promise.all()
https://developer.mozilla.org/en/docs/Web/javascript/Reference/Global_Objects/Promise/all
function getVideo(id)
return new Promise(function(resolve, reject)
findVideo(id, function(thumbnailPath, videoName)
resolve(
name: videoName,
thumbnail: thumbnailPath
);
);
);
var promises = videoIds.map(function(videoId)
return getVideo(videoId);
);
//callback in then section will be executed will all promises will be resolved
//and data from all promises will be passed to then callback in form ao array.
Promise.all(promises).then(function(data)
console.log(data);
);
// Same for other list of tasks.
【讨论】:
【参考方案2】:最简单的解决方案是只使用回调。只需将循环包装在一个函数中并执行类似的操作。
function findVid(callback)
for(var a = 0; a < videoIds.length; a++)
if(videoIds)
findVideo(videoIds[a], function(thumbnailPath, videoName) // findVideo is the async function
// it returns 2 values, thumbnailPath and videoName
videoNames[a] = videoName; // and then these 2 values are written in the arrays
thumbnaildPaths[a] = thumbnailPath;
console.log('1');
if (callback) callback(); //This will be called once it has returned
);
findVid(function()
//this will be run after findVid is finished.
console.log('3');
// Rest of your code here.
);
您也可以使用 Promise 样式而不是回调,但两者都可以工作。为了进一步了解回调和承诺,我找到了一篇很好的文章,可以更详细地解释一切:http://sporto.github.io/blog/2012/12/09/callbacks-listeners-promises/
【讨论】:
好的,但是我有 2 个for
循环在这个之后,所以我必须把if(callback) callback();
函数放在第二个?以上是关于Node.js 等到异步函数完成,然后继续执行其余代码的主要内容,如果未能解决你的问题,请参考以下文章