问题描述
我想将3张图片上传到我的node.js服务器。我从客户端发送这3个图像作为byte64数组。由于它是一个异步功能,如何不一个接一个地接一个做。有什么方法可以实现while循环或for循环,但是可以等待一次写操作结束的方法,以便在第一次通过时没有错误的情况下可以启动另一个写操作吗?因为当它只有3张图像时不难一一完成,但是如果有10张或更多,则每个文件都将作为上次编写的回调来完成。 请帮忙。 预先谢谢你。
解决方法
您可以使用fs.promises
来代替fs的promise。然后,您可以使用Promise.all()
来执行所有承诺。
一个例子是:
const fs = require('fs').promises;
const stuffToWrite = ["foo","bar","baz"];
// Create an async function
(async () => {
await Promise.all(stuffToWrite.map((value,index) => fs.writeFile(`${index}.txt`,value)));
console.log("Done!")
})();
这将创建3个文件,分别是0.txt,1.txt和2.txt。您可以根据自己的需要进行更改。
根据文档,Promise.all具有“快速失败”功能,如果失败,它将被拒绝。 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all)
,感谢您的答复和帮助。发表评论后,我在node.js中做到了这一点。我没有将其用作异步功能,而只是这样。我想问问是否有可能像我一样使用.then和.catch。我的意思是这可行,但是在文件流写完所有文件后如何获得响应?
Promise.all(
images.map((value,index) =>
fs.promises.writeFile(
getPath(index),value.base64,"base64",(err) => {
if (err) {
console.log(err);
} else {
console.log("done");
}
}
)
)
)
.then(() => {
res.status(200).send({ message: "data saved" });
})
.catch((err) => {
console.log(err);
res.status(404).send({ message: "something went wrong" });
});