如何解决使用Promise
我正在尝试使用min.io javascript API(https://docs.min.io/docs/javascript-client-api-reference#listObjectsV2)从s3存储桶中获取对象名称列表。 API返回一个流。但是,我总是得到一个空列表。
dataStream的示例为:
{
name: 'sample-mp4-file-1.mp4',lastModified: 2020-10-14T02:35:38.308Z,etag: '5021b3b7c402468d5b018a8b4a2b448a',size: 10546620
}
{
name: 'sample-mp4-file-2.mp4',lastModified: 2020-10-14T15:54:44.672Z,size: 10546620
}
我的功能
public async listFiles(
bucketName: string,prefix?: string
): Promise<string[]> {
const objectsList = [];
await minioClient.listObjectsV2(bucketName,"",true,function(
err,dataStream
) {
if (err) {
console.log("Error listFiles: ",err);
return;
}
console.log("Succesfully get data");
dataStream.on("data",function(obj) {
objectsList.push(obj.name);
});
dataStream.on("error",function(e) {
console.log(e);
});
dataStream.on("end",function(e) {
console.log("Total number of objects: ",objectsList.length);
});
});
return objectsList;
}
预期输出是列表对象名称[sample-mp4-file-1.mp4,sample-mp4-file-2.mp4]
解决方法
根据文档,listObjectsV2()
返回的是流,而不是诺言。因此,await
将在objectsList
包含任何内容之前立即返回。
您要await
使用的API必须支持Promises。
您可以通过执行以下操作来解决此问题:
const objectsList = await new Promise((resolve,reject) => {
const objectsListTemp = [];
const stream = minioClient.listObjectsV2(bucketName,'',true,'');
stream.on('data',obj => objectsListTemp.push(obj.name));
stream.on('error',reject);
stream.on('end',() => {
resolve(objectsListTemp);
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。