循环多个等待或承诺

之后我确实上传了文件,我将它们的数据保存在 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)

   });

 })

}


莫回无
浏览 96回答 1
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 甚至您的代码编辑器都会警告您。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript