Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/81.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
JQuery异步。每个都返回空承诺_Jquery_Arrays_Typescript_Object_Empty List - Fatal编程技术网

JQuery异步。每个都返回空承诺

JQuery异步。每个都返回空承诺,jquery,arrays,typescript,object,empty-list,Jquery,Arrays,Typescript,Object,Empty List,问题 嗨,朋友们 我遇到的问题是对象承诺返回我为空[]。而console.logI have documented向我显示数据 如果有办法解决这个问题,我将不胜感激 const getALLMovies=async(第页:number=1):Promise=>{ const res=await axios.get(`${BASE_URL}peliculas/${page}`); const body=等待恢复数据; const$=负载(车身); const承诺:IMovies[]=[]; $('

问题

嗨,朋友们

我遇到的问题是对象
承诺
返回我为空
[]
。而
console.log
I have documented向我显示数据

如果有办法解决这个问题,我将不胜感激

const getALLMovies=async(第页:number=1):Promise=>{
const res=await axios.get(`${BASE_URL}peliculas/${page}`);
const body=等待恢复数据;
const$=负载(车身);
const承诺:IMovies[]=[];
$('body div div div div div div#default-tab-1 div.a')。每个(异步(索引,元素)=>{
常量$element=$(element);
const id=$element.attr('href').replace(BASE_URL').trim();
const title=$element.find('div.listing-content p').text().trim();
const poster=$element.find('img').attr('src');
const extra=等待contentHandler(id);
承诺,推动({
//id:id | | null,
标题:标题| |空,
发信人:发信人| |空,
年份:额外[0]。年份| |空,
类型:额外[0]。类型| |空,
额定值:额外[0]。额定值| |空,
大纲:额外[0]。大纲| |空,
作者:额外[0]。作者| |空,
控制器:额外[0]。控制器| |空,
写入程序:额外[0]。写入程序| | null,
国家:额外[0]。国家| |空,
releaseDate:额外[0]。releaseDate | | null,
})
//log(JSON.stringify(promissions,null,2))-->数据显示在这里。
});
返回承诺。全部(承诺);
};
getALLMovies()
。然后(res=>{
console.log(res.map(x=>x))-->空对象
})

您遇到的问题是竞争条件。您的
。每个
处理程序调度一些异步代码,即它必须等待
contentHandler
的结果。同样地,当调用
getALLMovies
时,
promises
仍然是一个空数组,并且在对
contentHandler
的所有调用完成之前,该数组不会完全填充。也就是说,对于每个元素,
contentHandler
的结果排队(在下面的示例中为4次)

var承诺=[];
功能超时(毫秒){
返回新承诺(resolve=>setTimeout(resolve,ms));
}
异步函数go(){
$(“div”)。每个(异步()=>{
等待超时(1500);
console.log(“现在”);
承诺。推动(“榜样”);
})
console.log(承诺);
}
go()

谢谢@Zze

通过你的例子,我成功地展示了所有的数据

解决方案

const getALLMovies=async(页码=1)=>{
const res=await axios.get(`${BASE_URL}peliculas/${page}`);
const body=等待恢复数据;
const$=负载(车身);
const承诺:IMovies[]=[];
//const实际=第页;
//const lastPage=parseInt($('body div.app div.layout ul.pagination li').eq(4).find('a').attr('href').match(/\d/g).join(“”),10);
//常数分页={
//实际的,实际的,
//最后:最后一页
//}
const promise=$('body div#default-tab-1 div.a').map((索引,元素)=>new promise(异步(解析)=>{
常量$element=$(element);
const id=$element.attr('href').replace(BASE_URL').trim();
const title=$element.find('div.listing-content p').text().trim();
const poster=$element.find('img').attr('src');
const extra=等待contentHandler(id);
承诺,推动({
//id:id | | null,
标题:标题| |空,
发信人:发信人| |空,
年份:额外[0]。年份| |空,
类型:额外[0]。类型| |空,
额定值:额外[0]。额定值| |空,
大纲:额外[0]。大纲| |空,
作者:额外[0]。作者| |空,
控制器:额外[0]。控制器| |空,
写入程序:额外[0]。写入程序| | null,
国家:额外[0]。国家| |空,
releaseDate:额外[0]。releaseDate | | null,
});
决心(承诺)
}));
返回Promise.all(Promise.toArray());
};
getALLMovies()
。然后(res=>{
log(JSON.stringify(res,null,2))
})

<代码>请考虑提供一个如所描述的;考虑到上面的代码,您所描述的听起来不太可能,但是我当然不能自己测试它,所以我必须更新我的答案,以包含一个实现您期望结果的示例。很抱歉,@Zze很迂腐,但是
async
不会将执行移动到新线程。处理程序被添加到消息队列:它还使用显式承诺构造反模式:创建“新承诺”是不必要的。@avejidah是的,我将更新关于您的第一条评论的答案。第二条评论不适用于本例,因为
go()
没有等待内部承诺触发的结果,事实上与建议/接受的答案一致。如果你觉得我的回答不正确,请随意将此答案复制到你自己的网站上并发布。如果它所做的只是返回
timeout
,那么您将是正确的,但是OP将在本节中执行其他逻辑。我认为第二个是适用的
promises=$(“div”).map(async()=>{await timeout(1500);返回“value”;})
避免了显式的promise构造并导致相同的解析。哈哈!好吧,很接近,但不是很接近。现在将不定义
resolve
。只需返回“value”,它就会自动包装在Promise实例中。(例如,
[].map(async()=>{return“value”})
)使用显式承诺构造反模式:不需要创建“新承诺”。