我遇到了一个问题(竞争条件),我似乎无法克服。
我在下面的 console.log 语句中添加了两条注释。你可以看到第二个首先被调用,这是一个问题,因为那时 var 是空的。我有异步和等待,但仍然不确定为什么会这样
router.put("/", async (req, res, next) => {
var s3 = new AWS.S3();
var params = {
Bucket: "bucket1",
Delimiter: '/',
Prefix: req.body.params + '/'
};
var files= [];
var tmp = '';
await s3.listObjectsV2(params, function(err, data) {
for(var item in data.Contents){
for(var anotherItem in data.Contents[item]){
if(anotherItem == "Key"){
tmp = data.Contents[item][anotherItem]
var res = tmp.replace(req.body.params + '/', '')
files.push(res)
}
}
}
this.allFiles = files
console.log('allFiles - First', this.allFiles); //this is logged second and has the correct data array
});
console.log('allFiles - Second', this.allFiles); //this gets logged first and is empty
return res.send(this.allFiles);
});
最佳答案
await
仅适用于 Promises。看起来 listObjectsV2
是基于回调的,而不是基于 Promise 的——你必须明确地将它转换为 Promise
才能 await
,你还不如将 Promise
直接解析为 allFiles
:
const allFiles = await new Promise((resolve, reject) => {
s3.listObjectsV2(params, function(err, data) {
if (err) reject (err);
const files = [];
for(var item in data.Contents){
for(var anotherItem in data.Contents[item]){
if(anotherItem == "Key"){
tmp = data.Contents[item][anotherItem]
var res = tmp.replace(req.body.params + '/', '')
files.push(res)
}
}
}
console.log('allFiles - First', files);
resolve(files);
});
});
console.log('allFiles - Second', allFiles);
return res.send(allFiles);
关于javascript - 异步/等待的竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50830362/