Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.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()等待对象属性的返回_Javascript_Asynchronous_Promise_Async Await - Fatal编程技术网

Javascript Promise.all()等待对象属性的返回

Javascript Promise.all()等待对象属性的返回,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,Async Await,在一个异步函数中,我有一个循环,在这个循环中,我需要使用wait来解析另一个异步函数的承诺 异步函数小型城市(州){ const citiesInState=[]; for(const state of states){ 常量长度=等待长度状态(state.Sigla); 常量stateObject={ 州:州。西格拉, 城市:长度, }; citiesInState.push(stateObject); } citiesInState.sort((a,b)=>{ 如果(a.cities>b.c

在一个异步函数中,我有一个循环,在这个循环中,我需要使用wait来解析另一个异步函数的承诺

异步函数小型城市(州){
const citiesInState=[];
for(const state of states){
常量长度=等待长度状态(state.Sigla);
常量stateObject={
州:州。西格拉,
城市:长度,
};
citiesInState.push(stateObject);
}
citiesInState.sort((a,b)=>{
如果(a.cities>b.cities)返回1;
如果(a.citiesindex<5.reverse();
}
它的工作很好,但eslint说不允许在循环内部等待,并使用Promise.all()来解析所有承诺

问题是我的承诺是在一个对象属性中:


如何使用Promise.all()作为对象的属性?

将a
链接到
lengthOfState
调用上,使整个Promise解析为
Promise内您需要的对象。all

const citiesInState = await Promise.all(
  states.map(
    state => lengthOfState(state.Sigla).then(cities => ({ state: state.Sigla, cities }))
  )
);
const NEW_LAND='newLand'
const ACTUAL_FINLAND=‘actualFinland’
康斯特·皮尔卡斯兰=‘皮尔卡斯兰’
康斯特州城市地图={
[新大陆]:[赫尔辛基]、[万塔]、[科索],
[芬兰实际情况]:[图尔库],
[PIRKKAS_LAND]:[WHITE RAPIDS'、[NOKIA'],
}
const mockGetCities=(stateName)=>newpromise((res)=>{
setTimeout(()=>{res([stateName,STATE\u CITY\u MAP[stateName]]),0)
})
常量compareStatesByCityQty=(a,b)=>{
如果(a[1].length>b[1].length)返回1
if(a[1].length{
const cities=wait Promise.all(stateNames.map(mockGetCities))
回归城市
.排序(compareStatesByCityQty)
.reverse()
.slice(0,城市数量)
}
;(异步()=>{
const stateNames=[新土地、芬兰实际土地、皮尔克斯土地]
const smallestStates=await getSmallestStates(stateNames,2)
console.log(smallestStates)
})()

FYI,您的排序比较器可能是
return a.cities-b.cities
也可以使用
async
映射器,如果OP不想混合
wait
的话。然后()
谢谢大家,它的工作非常好。我将尝试执行,等待练习。
const NEW_LAND = 'newLand'
const ACTUAL_FINLAND = 'actualFinland'
const PIRKKAS_LAND = 'pirkkasLand'

const STATE_CITY_MAP = {
  [NEW_LAND]: ['HELSINKI', 'VANTAA', 'KORSO'],
  [ACTUAL_FINLAND]: ['TURKU'],
  [PIRKKAS_LAND]: ['WHITE RAPIDS', 'NOKIA'],
}

const mockGetCities = (stateName) => new Promise((res) => {
  setTimeout(() => { res([stateName, STATE_CITY_MAP[stateName]]) }, 0)
})

const compareStatesByCityQty = (a, b) => {
  if (a[1].length > b[1].length) return 1
  if (a[1].length < b[1].length) return -1
  return 0
}

const getSmallestStates = async (stateNames, cityQty) => {
  const cities = await Promise.all(stateNames.map(mockGetCities))
  return cities
    .sort(compareStatesByCityQty)
    .reverse()
    .slice(0, cityQty)
}

;(async () => {
  const stateNames = [NEW_LAND, ACTUAL_FINLAND, PIRKKAS_LAND]
  const smallestStates = await getSmallestStates(stateNames, 2)
  console.log(smallestStates)
})()