Javascript 在$each完成迭代后,如何执行某些内容?

Javascript 在$each完成迭代后,如何执行某些内容?,javascript,jquery,asynchronous,es6-promise,Javascript,Jquery,Asynchronous,Es6 Promise,基本上,我有一个非常简单的计数器,它从5个不同的位置加载JSON文件,并计算条目数: 让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://

基本上,我有一个非常简单的计数器,它从5个不同的位置加载JSON文件,并计算条目数:

让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://jsonplaceholder.typicode.com/todos, 5: https://jsonplaceholder.typicode.com/users }; 函数fetchJSONListurl{ 返回新的允诺函数解析、拒绝{ 获取URL .thenresponse=>{return response.json;} .然后下决心 .拒绝; }; } 函数checkAll{ 返回新的允诺函数解析、拒绝{ $.eachull,函数键{ fetchJSONListurl[key] .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; }; } .拒绝; }; 决定 }; } 检查所有 .然后$count-total.textcount.total .catchconsole.log; API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。 总计:正在加载。。。 但是,我希望总值仅在$之后更新。每个都完成了对url变量的迭代

嗯,确实如此。:-只是$。每个都不等待它开始完成的异步进程

如果您想让所有人同时运行,请使用map收集承诺和承诺。所有人等待他们全部实现或其中一人被拒绝:

函数checkAll{ return Promise.allObject.entriesurl.map[键,值]=> fetchJSONListvalue .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; }; } ; } 您还需要在此处修复呼叫:

.然后$count-total.textcount.total 调用$/*…*/.text/*…*/并将返回值传递给then。然后要传递一个函数:

.then=>$count-total.textcount.total 而且,fetchJSONList中没有理由有新的承诺;你已经有了一个承诺,只是从它链。但您确实需要处理的是,它不会拒绝HTTP错误,而是网络错误:

函数fetchJSONListurl{ 返回fetchurl .thenresponse=>{ 如果!回答。好的{ 抛出新错误HTTP error+response.status; } return response.json; }; } 综上所述:

让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://jsonplaceholder.typicode.com/todos, 5: https://jsonplaceholder.typicode.com/users }; 函数fetchJSONListurl{ 返回fetchurl .thenresponse=>{ 如果!回答。好的{ 抛出新错误HTTP error+response.status; } return response.json; }; } 函数checkAll{ return Promise.allObject.entriesurl.map[键,值]=> fetchJSONListvalue .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; }; } ; } 检查所有 .then=>$count-total.textcount.total .catchconsole.log; API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。 总计:正在加载。。。 但是,我希望总值仅在$之后更新。每个都完成了对url变量的迭代

嗯,确实如此。:-只是$。每个都不等待它开始完成的异步进程

如果您想让所有人同时运行,请使用map收集承诺和承诺。所有人等待他们全部实现或其中一人被拒绝:

函数checkAll{ 复述 n Promise.allObject.entriesurl.map[键,值]=> fetchJSONListvalue .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; }; } ; } 您还需要在此处修复呼叫:

.然后$count-total.textcount.total 调用$/*…*/.text/*…*/并将返回值传递给then。然后要传递一个函数:

.then=>$count-total.textcount.total 而且,fetchJSONList中没有理由有新的承诺;你已经有了一个承诺,只是从它链。但您确实需要处理的是,它不会拒绝HTTP错误,而是网络错误:

函数fetchJSONListurl{ 返回fetchurl .thenresponse=>{ 如果!回答。好的{ 抛出新错误HTTP error+response.status; } return response.json; }; } 综上所述:

让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://jsonplaceholder.typicode.com/todos, 5: https://jsonplaceholder.typicode.com/users }; 函数fetchJSONListurl{ 返回fetchurl .thenresponse=>{ 如果!回答。好的{ 抛出新错误HTTP error+response.status; } return response.json; }; } 函数checkAll{ return Promise.allObject.entriesurl.map[键,值]=> fetchJSONListvalue .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; }; } ; } 检查所有 .then=>$count-total.textcount.total .catchconsole.log; API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。 总计:加载… 让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://jsonplaceholder.typicode.com/todos, 5: https://jsonplaceholder.typicode.com/users }; 函数fetchJSONListurl{ 返回新的允诺函数解析、拒绝{ 获取URL .thenresponse=>{return response.json;} .然后下决心 .拒绝; }; } 函数checkAll{ 返回新的允诺函数解析、拒绝{ $.eachull,函数键{ fetchJSONListurl[key] .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; $'count-total'.textcount.total; }; } .拒绝; }; 分解计数; }; } checkAll; API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。 总计:加载… 让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 }; 让url={ 1: https://jsonplaceholder.typicode.com/posts, 2: https://jsonplaceholder.typicode.com/comments, 三:https://jsonplaceholder.typicode.com/albums, 4: https://jsonplaceholder.typicode.com/todos, 5: https://jsonplaceholder.typicode.com/users }; 函数fetchJSONListurl{ 返回新的允诺函数解析、拒绝{ 获取URL .thenresponse=>{return response.json;} .然后下决心 .拒绝; }; } 函数checkAll{ 返回新的允诺函数解析、拒绝{ $.eachull,函数键{ fetchJSONListurl[key] .thenlist=>{ 如果$.isEmptyObjectlist{ const spanID=api-+键; $spanID.text0; } $.eachlist,函数{ 计数[键]+; count.total++; const spanID=api-+键; $spanID.textcount[key]; $'count-total'.textcount.total; }; } .拒绝; }; 分解计数; }; } checkAll; API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。
总计:加载…您在履行任何承诺之前解决的问题。所以解决办法是使用Promise.all

下面的代码片段可以帮助您在显示总计之前延迟一秒钟,以便您可以清楚地看到其行为

让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 } 让url={ 1: 'https://jsonplaceholder.typicode.com/posts', 2: 'https://jsonplaceholder.typicode.com/comments', 3: 'https://jsonplaceholder.typicode.com/albums', 4: 'https://jsonplaceholder.typicode.com/todos', 5: 'https://jsonplaceholder.typicode.com/users' } 函数fetchJSONListkey{ 返回新的允诺函数解析、拒绝{ fetchurl[键] .thenresponse=>{ return response.json } .thenlist=>resolve[键,列表] .catchreject } } 函数checkAll{ 返回新的允诺函数解析、拒绝{ Promise.allObject.keysurl.mapkey=>fetchJSONListkey .thenresults=>{ results.forEach[key,list=[]]=>{ 如果$.isEmptyObjectlist{ const spanID='api-'+键 $spanID.text0 } $.eachlist,函数{ 计数[键]++ 总数++ const spanID='api-'+键 $spanID.textcount[键] } } 设置超时=>{ $'count-total'.textcount.total 决定 }, 1000 } .catchreject } } 检查所有 API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。
总计:加载…您在履行任何承诺之前解决的问题。所以解决办法是使用Promise.all

下面的代码片段可以帮助您在显示总计之前延迟一秒钟,以便您可以清楚地看到其行为

让计数={ 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 总数:0 } 让url={ 1: 'https://jsonplaceholder.typicode.com/posts', 2: 'https://jsonplaceholder.typicode.com/comments', 3: 'https://jsonplaceholder.typicode.com/albums', 4: 'https://jsonplaceholder.typicode.com/todos', 5: 'https://jsonplaceholder.typicode.com/users' } 函数fetchJSONListkey{ 返回新的允诺函数解析、拒绝{ fetchurl[键] .thenresponse=>{ return response.json } .thenlist=>resolve[键,列表] .catchreject } } 函数checkAll{ 返回新的允诺函数解析、拒绝{ Promise.allObject.keysurl.mapkey=>fetchJSONListkey .thenresults=>{ results.forEach[key,list=[]]=>{ 如果$.isEmptyObjectlist{ const spanID='api-'+键 $spanID.text0 } $.eachlist,函数{ 计数[键]++ 总数++ const spanID='api-'+键 $spanID.textcount[键] } } 设置超时=>{ $'count-total'.textcount.total 决定 }, 1000 } .catchreject } } 检查所有 API 1:加载。。。 API 2:加载。。。 API 3:加载。。。 API 4:加载。。。 API 5:加载。。。
总计:加载…我尝试了那个,但问题是,如果所有5个API在不同的时间加载(例如由于连接问题),那么在加载最慢的API之前,总计将不准确。不过还是要谢谢你的回答!别担心。我认为有人已经对如何处理承诺提供了更好的解释:thumbsup:我试过了,但问题是如果所有5个API都在不同的时间加载(例如由于连接问题),那么在加载最慢的API之前,总数将不准确。不过还是要谢谢你的回答!别担心。我想有人已经提供了更好的解释如何处理承诺:拇指:我完全没有想到香草地图XD非常感谢!等一下。。。对于下面的checkAll执行,是否仍在使用.then更新值?@francy.not.frank-是,在上面的前两个代码块中。在第三个代码块中,它使用了异步函数,相当于在等待之后放置代码。嗯,我的第二个版本有什么问题……我认为checkAll在这种情况下有点冗余,所以我将代码移到了外部。@francy.not.frank-抱歉,我没有注意到您当时使用的方式存在问题。我已经更新了答案并添加了实时片段-我不知道为什么我最初不这么做,我想我已经习惯了人们使用不运行的片段,我甚至没有检查。我完全没有想到香草地图XD,非常感谢!等一下。。。对于下面的checkAll的执行,是否仍使用.th
en是否更新值?@francy.not.frank-是,在上面的前两个代码块中。在第三个代码块中,它使用了异步函数,相当于在等待之后放置代码。嗯,我的第二个版本有什么问题……我认为checkAll在这种情况下有点冗余,所以我将代码移到了外部。@francy.not.frank-抱歉,我没有注意到您当时使用的方式存在问题。我已经更新了答案并添加了实时代码段-我不知道为什么一开始我没有这么做,我想我已经习惯了人们使用不运行的代码段,我甚至没有检查。感谢您提供了一个实际的可运行的问题示例!这真是太好了。感谢您提供了一个实际的可运行的问题示例!那真是太好了。