gpt4 book ai didi

javascript - 异步/等待的竞争条件

转载 作者:行者123 更新时间:2023-11-30 11:18:02 25 4
gpt4 key购买 nike

我遇到了一个问题(竞争条件),我似乎无法克服。

我在下面的 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/

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