gpt4 book ai didi

javascript - 如何避免node.js的异步行为?

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:05 25 4
gpt4 key购买 nike

我正在上传多个文件并保存在某个目录中。我的代码如下

app.post('/file_upload', function (req, res) {
var msgs = '';

req.files.forEach(function(element) {
var fileNameToWrite = __dirname + "\\uploads\\" + element.originalname;
fs.readFile( element.path, function (err, data) {
fs.writeFile(fileNameToWrite, data, function (err) {
if( err ){
msgs += element.originalname + " Uploaded Failed Error: '"+ err +"' ";
}
else{
msgs += element.originalname + " Uploaded Successfully ";
}
});
});
},this);
console.log("Final Msgs: " + msgs);
res.end( JSON.stringify( msgs ) );
});

问题是 msgs 是异步填充的,我想在 forEach 完成后获取消息。我怎样才能实现这个目标?

最佳答案

为了让异步函数看起来不那么异步,我想要做的是 Promises 。特别是Bluebird promise library非常好。本质上,您的函数可能如下所示:

var Promise = require('bluebird')
var readFile = Promise.promisify(require('fs').readFile);

app.post('/file_upload', function (req, res) {
var msgs = '';

req.files.forEach(function(element) {
var fileNameToWrite = __dirname + "\\uploads\\" + element.originalname;
readFile(element.path).then(function (data) {
return writeFile(filenameToWrite, data);
}).then(function () {
msgs += element.originalname + " Uploaded Successfully ";
}).catch(function () {
msgs += element.originalname + " Uploaded Failed Error: '"+ err +"' ";
}).then(function () {
console.log("Final Msgs: " + msgs);
res.end( JSON.stringify( msgs ) );
});
},this);
});

这保留了异步调用的所有优点(例如,不锁定正在运行的线程),使您的 API 快速且响应灵敏。尽管如此,它仍然可以让您通过链接 then 来“仿佛”编写同步代码。

关于javascript - 如何避免node.js的异步行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33341374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com