Javascript 承诺然后数组。推另一个承诺不起作用?
我试图循环通过从API异步返回的值数组,在该循环中,我想调用另一个返回承诺的函数。我无法在循环中得到要评估的第二个承诺。我该怎么做Javascript 承诺然后数组。推另一个承诺不起作用?,javascript,promise,Javascript,Promise,我试图循环通过从API异步返回的值数组,在该循环中,我想调用另一个返回承诺的函数。我无法在循环中得到要评估的第二个承诺。我该怎么做 async componentDidMount(){ const resolvedCampgrounds = await this.returnThoseValues('getListings','/world') resolvedCampgrounds.forEach(async feature=> { if (feature['map
async componentDidMount(){
const resolvedCampgrounds = await this.returnThoseValues('getListings','/world')
resolvedCampgrounds.forEach(async feature=> {
if (feature['mapOn'].toUpperCase()==='TRUE'){
await coordinateData.push({
"key": feature['id'],
"Address": feature['street_address'] + feature['zip_code'],
"image": jpg,
"position": CodeAddress(feature['street_address'] + feature['zip_code'],this.props.google).then(value => {return value})
})
}
})
set_state(coordinateData);
CodeAddress()返回一个已解析的承诺,我尝试通过.then()访问该承诺的结果。到目前为止,我能够实现这一点的唯一方法是在每个对象的循环中单独调用set_状态(而不是数组.push ing),但这还不够,因为我需要“批量推送”,而不是每次都更改状态。代码中的一个问题是,您正在使用forEach执行一些异步操作,而forEach不支持它 也许如果你解决了这个问题,你原来的问题也会解决 您需要添加另一个名为asyncForEach的方法,如下所示
async function asyncForEach(array, callback) {
for (let index = 0; index < array.length; index++) {
await callback(array[index], index, array);
}
}
了解更多信息
resolvedCampgrounds
这是一个承诺数组吗?对于初学者,在解析CodeAddress()后如何执行数组。push()?Array.push()不是一个异步进程,如果你这样做,那么它将在“position”atribute上推送一个字符串“promise”。解决方法是使用异步模块。有了这个,如果需要的话,yu还可以通过一次运行多个线程来加快异步功能await async.eachLimit(ResolvedCampGrands,limit,(feature)=>{
我不知道CodeAddress()函数的工作原理,但我建议:让position=await CodeAddress(feature['street\u address']+feature['zip\u code',this.props.google)。然后(value=>{return value})
No sorry这是一个普通数组@KunalMukherjeeI试图在if()语句之后和.push之前解析CodeAddress().push。我在.push中使用value,它会在返回[]的地方执行一些异步操作在控制台日志中,值仅在我展开console.log时出现。因此没有正确地同步发送到set_state@IonutEugenDid不知道这一点。实现了这一点,但没有解决问题,因为数组返回async(在console.log中显示为[],对象仅在展开日志时可见…,据我理解应该是[{..},{..}])coordinateData的类型是什么?@user12726868另外,我在您的代码检查中发现了另一个问题,更新的版本假设CodeAddress是一个返回承诺的函数
async componentDidMount(){
const resolvedCampgrounds = await this.returnThoseValues('getListings','/world')
asyncForEach(resolvedCampgrounds, async feature=> {
if (feature['mapOn'].toUpperCase()==='TRUE'){
const position = await CodeAddress(feature['street_address'] + feature['zip_code'],this.props.google);
coordinateData.push({
"key": feature['id'],
"Address": feature['street_address'] + feature['zip_code'],
"image": jpg,
"position": position
})
}
})
set_state(coordinateData);