nodejs中for循环和异步调用的那些坑

若如初见. 提交于 2019-11-27 13:35:03

在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
                console.log(i);
            })
        }
        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");
    });
});


以上内容经过真实校验,详见:https://github.com/webPageDev/Demo

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!