Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Promise.all返回Promise,而不是.next(…)中的预期数据有效负载_Javascript_Arrays_Promise_Async Await - Fatal编程技术网

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]
。这也解释了我在控制台中看到的内容。我不会在一百万年内尝试用“平面地图”来解决这个问题。非常感谢你的帮助。这件事我已经做了两天了,所以我相信我已经解决了——没有你的帮助,我是不可能做到的。再次感谢。