为了账号安全,请及时绑定邮箱和手机立即绑定

循环多个等待或承诺

循环多个等待或承诺

莫回无 2023-06-09 14:57:53
之后我确实上传了文件,我将它们的数据保存在 mongo 中,但是如果我处理一个文件,它就可以工作,但是 loop/forEach/map/for 无论如何都不工作文件循环        await Promise.all(files.map(async (file) => {           let url= await uploadFileAndSave(req, file);            await saveFileDB(file,url);        } ))上传文件功能承诺    return new Promise(async (resolve, reject) => {        let pathDir = req.params.uId + "/";        let typeFolder = getTypeFolder(file.name);        console.log("type", typeFolder);        if (typeFolder) {            pathDir += req.body.app ? req.body.app + "/" : "";            pathDir += req.body.appId ? req.body.appId + "/" : "";            pathDir += typeFolder + "/";            currentPath = path.join(__dirname, "../uploads/", pathDir, Date.now() + "__" + file.name)            console.log("currentPath", currentPath);            file.mv(currentPath).then(async () => {                console.log("sAAaved!!!", file.name);                resolve(currentPath)            })        }    })}保存数据库功能saveFileDB = async (file, pathUrl) => { return new Promise(async(resolve, reject) => { let name = pathUrl.slice(pathUrl.lastIndexOf('/') + 1, pathUrl.length) let newFile = new fileModel({     name,     url: pathUrl,     dateCreated: Date.now(),     size: file.size / 1024 / 1024,     icon: iconsClasses[file.name.split(".")[1]],     delete: false, }); // console.log("newFile",newFile); try {     let result = await newFile.save();     console.log("save in db", result); } catch (err) {     console.log(err);     res.send(err); }   newFile.save((err, fileSaved) => {     if (err){       console.log("err",err);       reject(err)}       console.log('fileSaved',fileSaved);     resolve(fileSaved)   }); })}
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

尽量弄清楚你是想要一个承诺,还是要解决的结果

在您的第一个代码块中,您正确地打算组装一个承诺列表,以便您可以将它们与 a 合并Promise.all,然后等待整个结果,与await.


但是,在我看来,您不小心await在内部函数(在.map)内分别对每个 promise 进行了处理,因此输入的数组Promise.all不再是一个 promise 数组。


而不是这个:


await Promise.all(files.map(

    async (file) => {

       let url= await uploadFileAndSave(req, file);

       await saveFileDB(file,url); 

       // This inner function "async (file) => ..." does not 

       // have a `return` statement, so it returns `undefined`, rather than 

       // the promise you intended to return. This is because you `await`ed 

       // the promise already, rather than `return`ing it to the outer loop.

    } 

))

我建议这样做:


await Promise.all(files.map(

    async (file) => {

        let url= await uploadFileAndSave(req, file);

        return saveFileDB(file,url); 

        // Now the inner "async (file) =>" function returns

        // a promise (because that is the result type of saveFileDB)

    } 

))

作为文体问题,您可能还想将“let url =”更改为“const url =”。每当您知道您正在创建一个变量,其值在被销毁之前不会改变时,将其标记为const. 这在调试时(例如,在代码变长之后)对读者和您自己都有帮助,而且当您尝试重新分配它时,Javascript 甚至您的代码编辑器都会警告您。


查看完整回答
反对 回复 2023-06-09
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信