在nodejs中for循环中是不能嵌套使用异步调用的,就像下面的:
我们定义一个post请求,用于接受前端发送来的文件,然后使用for循环对目录下的一些文件依次做一些异步调用事情(使用fs的stat)
router.post('/uploadfile', function (req, res) {
upload(req, res, function (err) {
if (err) {
return res.end("Error uploading file.");
}
for(let i = 0; i<req.files.length;i++) {
fs.stat('./', req.files[i].originalname, function (err, stats) {
//do somethins
upload(req, res, function (err) {
if (err) {
return res.end("Error uploading file.");
}
for(let i = 0; i<req.files.length;i++) {
fs.stat('./', req.files[i].originalname, function (err, stats) {
//do somethins
console.log(i);
})
}
res.end("File is uploaded");
});
});
}
res.end("File is uploaded");
});
});
这里我们期望打印的log是从1到file文件的数量-1,可结果不会如我们所想,因为是异步调用,for循环不会按照要求执行,改进方式是使用递归调用
router.post('/uploadfile', function (req, res) {
upload(req, res, function (err) {
if (err) {
return res.end("Error uploading file.");
}
(function iterator(index) {
if(index === req.files.length) {
return;
}
fs.stat('./', req.files[index].originalname,function (err, stats) {
// do something
console.log(index);
iterator(index + 1);
})
})
res.end("File is uploaded");
});
});
upload(req, res, function (err) {
if (err) {
return res.end("Error uploading file.");
}
(function iterator(index) {
if(index === req.files.length) {
return;
}
fs.stat('./', req.files[index].originalname,function (err, stats) {
// do something
console.log(index);
iterator(index + 1);
})
})
res.end("File is uploaded");
});
});
以上内容经过真实校验,详见:https://github.com/webPageDev/Demo
来源:CSDN
作者:HelloWorld程序猿
链接:https://blog.csdn.net/u012631731/article/details/73748117