如果我有一系列承诺,我可以简单地使用Promise.all
等待所有承诺。
但是当我有一个对象数组时,每个对象都有一些承诺的属性,是否有一个很好的方法来处理它?</ p>
示例:
const files=urlOfFiles.map(url=>({
data: fetch(url).then(r=>r.blob()),
name: url.split('/').pop()
}))
//what to do here to convert each file.data to blob?
//like Promise.all(files,'data') or something else
答案 0 :(得分:4)
您可以将数据映射到解析为对象的promises数组,而不是将数据映射到对象数组:
const promises = urlOfFiles
.map(url => fetch(url)
// r.blob() returns a promise, so resolve that first.
.then(r => r.blob())
// Wrap object in parentheses to tell the parser that it is an
// object literal rather than a function body.
.then(blob => ({
data: blob,
name: url.split('/').pop()
})))
Promise.all(promises).then(files => /* Use fetched files */)
答案 1 :(得分:2)
尝试这样的事情:
const files = urlOfFiles.map(url=>
fetch(url).then(r=> ({
data: r.blob()
name: url.split('/').pop()
})
))
Promise.all(files)
答案 2 :(得分:1)
使用返回值的多个异步属性,您可以使用嵌套的Promise.all
(如果其他异步结果依赖于fetch
的响应)或者像Tulir建议的那样;从Promise.all([fetch(url),other])...
:
Promise.all(
urlOfFiles.map(
url=>
fetch(url)
.then(
r=>
Promise.all([//return multiple async and sync results
r.blob(),
Promise.resolve("Other async"),
url.split('/').pop()
])
)
.then(
([data,other,name])=>({//return the object
data,
other,
name
})
)
)
)
.then(
files=>
console.log("files:",files)
);