如何从Promise.all()提取数据?遇TypeError:循环结构转JSON错误
解决Promise.all调用AWS S3方法时的JSON循环结构错误
嘿,我太懂你遇到的这个坑了!这个错误的根源在于AWS SDK v2的方法默认返回的不是纯数据Promise,而是一个带循环引用的Request对象——虽然它能被当作Promise用,但这个对象内部绑定了很多SDK的上下文(比如客户端实例、请求元数据这类),这些结构互相引用,直接用JSON.stringify自然会报错。
而你用回调模式时,SDK直接给你传了纯业务数据,所以序列化完全没问题。
正确的解决方法:调用.promise()获取纯数据Promise
你只需要在每个S3方法调用后加上.promise(),就能得到只返回业务数据的Promise,这样Promise.all的结果就可以正常序列化了:
// 给每个方法调用加上.promise() var query1 = s3.headObject(getMetaData).promise(); var query2 = s3.listObjects(searchBucket).promise(); Promise.all([query1, query2]) .then(([metaData, bucketData]) => { // 用数组解构直接拿到两个结果,可读性拉满 console.log("MetaData:", JSON.stringify(metaData)); console.log("Bucket:", JSON.stringify(bucketData)); }) .catch(err => { if (err) throw err; });
为什么这样能解决问题?
当你调用.promise()时,AWS SDK会返回一个标准Promise,它resolve的结果和回调模式下的data参数完全一致——就是你需要的纯业务数据(比如你给出的包含AcceptRanges、Metadata的对象),没有任何循环引用的内部结构,自然可以用JSON.stringify正常处理。
额外小技巧:解构赋值让代码更清晰
在then里用数组解构([metaData, bucketData]),可以直接把两个Promise的结果分别赋值给变量,比用data[0]和data[1]可读性高很多,推荐使用~
内容的提问来源于stack exchange,提问作者WHOATEMYNOODLES
相关产品推荐
相关产品推荐

