在JavaScript中使forEach异步
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在JavaScript中使forEach异步,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1900字,纯文字阅读大概需要3分钟。
内容图文
![在JavaScript中使forEach异步](/upload/InfoBanner/zyjiaocheng/694/927eaa8ba54a47e792da8f6d55bed252.jpg)
我试图理解异步编程Node.js,但是在此代码上停滞了.
此函数在其回调中返回目录中的文件数组:
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (exists) {
fs.readdir(path, function (err, files) {
if (err) {
throw err;
}
var result = [];
files.forEach(function (filename, index) {
result[index] = filename;
});
return callback(result);
});
}
});
}
但是,当我在.forEach中使用异步代码时,它什么也不返回:
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (exists) {
fs.readdir(path, function (err, files) {
if (err) {
throw err;
}
var result = [];
files.forEach(function (filename, index) {
fs.stat(path + filename, function (err, stats) {
if (err) {
throw err;
}
result[index] = filename;
});
});
return callback(result);
});
}
});
}
我了解发生这种情况的原因,但不了解如何编写正确的代码.
解决方法:
其他答案可能效果很好,但是目前它们在语义上与原始代码大不相同:它们都并行执行统计信息,而不是顺序执行统计信息. forEach将启动与文件列表中的文件一样多的异步stats操作.这些操作的完成顺序可能与列表的原始顺序完全不同.这可能会严重影响错误处理逻辑.
以下方法实现了状态机,该状态机旨在异步执行统计信息,但顺序执行(未经测试):
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (!exists)
callback(null, null); // node (err, result) convention
else {
fs.readdir(path, function (err, files) {
if (err)
callback(err, null); // node (err, result) convention
else {
var results = [];
var i = 0;
nextStep(); // process the first file (the first step)
function nextStep() {
if (i >= files.length) // no more files?
callback(null, result); // node (err, result) convention
else {
fs.stat(path + files[i], function (err, stats) {
if (err)
callback(err, null); // node (err, result) convention
else {
results[i++] = stats;
// proceed to the next file
nextStep();
}
});
}
}
}
}
}
});
});
Promises可能有助于降低上述著名的“Pyramid of Doom”的嵌套水平.
内容总结
以上是互联网集市为您收集整理的在JavaScript中使forEach异步全部内容,希望文章能够帮你解决在JavaScript中使forEach异步所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。