【发布时间】:2021-07-04 05:59:19
【问题描述】:
我对异步函数过于陌生,如果我弄错了,很抱歉。目前,我尝试使用 mscdex node-ftp 节点包通过 FTP 上传给定目录中的所有文件夹。虽然这很有效,但承诺在我的函数中解决得太早了,并且会在上传完全完成之前在主函数中运行其他代码。
有没有办法让uploadFolder函数后的代码只有在uploadFolder函数完全完成后才运行?
var c = new Client(config);
let uploadFolder = (folderToUpload) => {
try {
return new Promise((resolve, reject) => {
let folderName = folderToUpload.substring(
folderToUpload.lastIndexOf("/") + 1
);
let replacedItem = folderToUpload.replace(folderName, "");
let uploadOrder = Glob.sync(folderToUpload + "/**/*");
c.on("ready", () => {
let uploadOrderFiltered = uploadOrder.map((element) => {
return element.replace(replacedItem, "");
});
c.mkdir(`/${folderName}`, false, (error) => {
if (error) {
console.log(`Error, MKDIR Error ${error}`);
c.end();
}
});
for (let i = 0; i < uploadOrderFiltered.length; i++) {
if (uploadOrderFiltered[i].includes(".")) {
c.put(
`${replacedItem}${uploadOrderFiltered[i]}`,
`/${uploadOrderFiltered[i]}`,
(error) => {
if (error) {
console.log(`Error, UPLOADING Error ${error}`);
c.end();
}
}
);
} else {
c.mkdir(`/${uploadOrderFiltered[i]}`, false, (error) => {
if (error) {
console.log(`Error, MKDIR Error ${error}`);
c.end();
}
});
}
}
c.end();
});
c.connect(config);
resolve();
});
} catch (error) {
console.log(`[FTP ERROR]: ${error}`);
reject();
}
};
const { createFolder } = require("./createFolder");
let asyncFunc = async () => {
// ... CODE BEFORE (Runs Fine)
//PROMISE BROKEN
await uploadFolder(
"D:/GitHub/Procedural-Artwork-Generation/nexRender/Project/Output/zeroTwoTemplate_AJDKAJKDJKADJKA"
);
console.log("[FTP]: Upload Done");
//Upload Done is running before uploadFolder function is completed.
提前感谢您的帮助。
【问题讨论】:
-
您早在任何异步操作完成之前就解决了您的
promise。只有当您收到一个表明所有异步工作都已完成的事件时,您才需要调用 resolve()。另外,你似乎有一个异步循环,所以在所有这些都完成之前你不能调用resolve()。如果你承诺一个在循环中使用的.put()操作,那么这个问题会更容易解决,然后你可以使用承诺来管理控制流、完成和错误传播。 -
为这个建议干杯,在进一步查看之后,找到方法来确定哪些函数表明所有异步命令都已完成我找到了 c.on("end") 事件,我已经链接这个有承诺的。
-
这是大体思路,但您似乎有一个异步操作循环,因此您需要知道循环中的每个操作何时完成。
标签: javascript node.js asynchronous ftp