Javascript Promise.all返回Promise,而不是.next(…)中的预期数据有效负载
我目前正在努力理解承诺和所有承诺。我在这里实现了我想要实现的目标,几乎可以实现: 代码是:Javascript Promise.all返回Promise,而不是.next(…)中的预期数据有效负载,javascript,arrays,promise,async-await,Javascript,Arrays,Promise,Async Await,我目前正在努力理解承诺和所有承诺。我在这里实现了我想要实现的目标,几乎可以实现: 代码是: const currencyArray = [ { currencyFrom: "USD", currencyTo: "GBP", urls:[ "https://jsonplaceholder.typicode.com/todos/1", "https://jsonplaceholder.typicode.com/todos/2", ]
const currencyArray = [
{
currencyFrom: "USD",
currencyTo: "GBP",
urls:[
"https://jsonplaceholder.typicode.com/todos/1",
"https://jsonplaceholder.typicode.com/todos/2",
]
},
{
currencyFrom: "SGD",
currencyTo: "USD",
urls:[
"https://jsonplaceholder.typicode.com/todos/3",
"https://jsonplaceholder.typicode.com/todos/4",
]
},
{
currencyFrom: "CNY",
currencyTo: "EUR",
urls:[
"https://jsonplaceholder.typicode.com/todos/5",
"https://jsonplaceholder.typicode.com/todos/6",
]
}
]
async function fetchData(currencyFrom, currencyTo, url) {
const res = await fetch(url)
let dataResp = await res.json()
dataResp = dataResp.map((data) => data)
let newDataObj = {
currencyFrom: currencyFrom,
currencyTo: currencyTo,
response: dataResp,
}
return newDataObj
}
const promises = currencyArray.map((currency) =>
currency.urls.map((url) => {
return fetchData(currency.currencyFrom, currency.currencyTo, url).then(
(data) => {
// console.log(data)
return data
})
})
)
Promise.all(promises)
.then((data) => data)
.then((data) => console.log('I expect data, but all I get is Promises, Promises:', data))
我想实现的是映射currencyArray中的每个对象,从currencyArray.url数组中的每个url获取数据,然后在所有承诺都已解决时,为每个currencyArray项返回一个类似的对象,如下所示:
[{
currencyFrom: "USD",
currencyTo: "GBP",
responses:[
// ** DATA FETCHED FROM API CALLS **
]
},{
// ....more objects like the above
}
]
上面的codepen实现获得了99%的结果,但是无论我做什么,结果总是返回[Promise,Promise]数组。如果我在浏览器控制台中深入到数组中,我实际上可以看到已解析的数据,但是尝试在.then()中访问此信息被证明是徒劳的。有人能帮我理解我做错了什么,并提供一个可行的例子吗
我已经搜索了堆栈溢出,并尝试了许多替代实现,以上是最接近于我所管理的工作解决方案。
提前感谢您提供的任何帮助
注意:为了完整起见,这里是我在应用程序()中的实际实现,上面的代码笔是一个经过修改的存根版本,使用公共API。
Promise。当您有一系列承诺时,所有的承诺都会起作用。在您的案例中,这是一系列承诺
[[承诺,承诺],…]
这就是我合并所有这些值的方式
const承诺=[
[
新承诺((解决,拒绝)=>resolve({prop:1})),
新承诺((解决,拒绝)=>resolve({prop:2}))
],
[
新承诺((解决,拒绝)=>resolve({prop:3})),
新承诺((解决,拒绝)=>resolve({prop:4}))
],
[
新承诺((解决,拒绝)=>resolve({prop:5})),
新承诺((解决,拒绝)=>resolve({prop:6}))
]
];
(异步()=>{
const result=await Promise.all(promises.map(异步pr=>await Promise.all(pr)))
控制台日志(结果);
})()
问题似乎不在于承诺本身,而在于阵列的构建方式。内部映射创建承诺的内部集合,但外部映射不直接使用这些承诺flatMap
可用于展平集合:
const promises = currencyArray.flatMap(currency =>
currency.urls.map(url => fetchData(currency.currencyFrom, currency.currencyTo, url))
);
const currencyArray=[
{
货币来源:“美元”,
货币:“英镑”,
网址:[
"https://jsonplaceholder.typicode.com/todos/1",
"https://jsonplaceholder.typicode.com/todos/2",
]
},
{
货币来源:“新加坡元”,
货币:“美元”,
网址:[
"https://jsonplaceholder.typicode.com/todos/3",
"https://jsonplaceholder.typicode.com/todos/4",
]
},
{
货币来源:“人民币”,
货币:“欧元”,
网址:[
"https://jsonplaceholder.typicode.com/todos/5",
"https://jsonplaceholder.typicode.com/todos/6",
]
}
]
异步函数fetchData(currencyFrom、currencyTo、url){
const res=等待获取(url),
dataResp=await res.json(),
newDataObj={
currencyFrom:currencyFrom,
currencyTo:currencyTo,
答复:dataResp,
};
返回newDataObj
}
const promises=currencyArray.flatMap(货币=>
currency.url.map(url=>fetchData(currency.currencyFrom,currency.currencyTo,url))
);
Promise.all(promises.then(console.log)代码>太棒了!感谢您指出问题所在并提供解决方案!我以前从来没有听说过也没见过“平面地图”。我现在要调查一下这些差异!再次感谢!控制台使用“map”和“flatMap”注销my promises变量显示了两组不同的承诺-但我并不真正理解它们之间的区别,您是否可以详细介绍一下这是如何工作的?很高兴它有所帮助。flatMap本身相对较新。与C#中的相当,选择many
。第一个map(map)构造在数组[[1,2][3,4]]
中创建了一个数组flatMap
所做的是“展平”它,也就是说:它从所有内部数组/iterables创建一个数组:[1,2,3,4]
。这也解释了我在控制台中看到的内容。我不会在一百万年内尝试用“平面地图”来解决这个问题。非常感谢你的帮助。这件事我已经做了两天了,所以我相信我已经解决了——没有你的帮助,我是不可能做到的。再次感谢。