我有这样的一堆代码
- function b(i){
-
- return new Promise((resolve)=>{
-
- setTimeout(()=>{
-
- resolve(i)
-
- },200*(7-i))
-
- }).then(e=>{
-
-
-
- console.log(e)
-
- })
-
- }
-
-
-
- async function aa(){
-
-
-
- let i=5;
-
- await b(5);
-
- await b(4);
-
- await b(3);
-
- await b(2);
- await b(1);
-
- console.log("最后")
-
- }
-
- aa();
我觉得吧这样调用多次b函数有点不大合适,我就想把,能不能减少点代码量。于是用foreach来替代,
代码变成如下:
- function b(i){
-
- return new Promise((resolve)=>{
-
- setTimeout(()=>{
-
- resolve(i)
-
- },200*(7-i))
-
- }).then(e=>{
-
-
-
- console.log(e)
-
- })
-
- }
-
- async function aa(){
-
- await [1,2,3,4,5].forEach(async (i)=>{
-
- await b(i);
-
- })
-
- console.log("最后")
-
- }
-
- aa()
“最后”第一个打印,这我觉得不符合我的需要,这问题肯定是出现在了foreach上面,但是我不知道为何。
那试试while呗,又不是不得行,于是把代码改成了如下;
- async function aa(){
-
-
-
- let i=5;
-
- while(i>0){
-
- i--;
-
- await b(i);
-
-
-
- }
-
- console.log("最后")
-
- }
-
- aa()
然后它可以了。所以先暂时下个结论,某种场景下可以用while来替代foreach,就好像下面这一串代码:
- async function aa(){
-
- let arr=[5,4,3,2,1];
-
- let i=arr.length-1;
-
-
- while(i>0){
-
- i--;
-
- await b(arr[I]);
-
-
-
- }
-
- console.log("最后")
-
- }
-
- aa()
用for也不是不行的嘛,为何非得纠结foreach!!
- async function aa(){
-
-
-
- for(let i=5;i>0;i--){
-
- await bb(i);
-
-
-
- }
-
- console.log("最后")
-
- }
-
- aa()
滚~~~~~
其实foreach用不了,它是有原因的,foreach其实是基于while二次封装的,foreach它本身是没有用到asyn去装饰的,所以在调用时候用await是无效的。
有代码为证哈,不是我瞎掰
- // Production steps of ECMA-262, Edition 5, 15.4.4.18
-
- // Reference: http://es5.github.io/#x15.4.4.18
-
- if (!Array.prototype.forEach) {
-
-
-
- Array.prototype.forEach = function(callback, thisArg) {
-
- //…
-
- }
这个代码是网友从pollyfill源码代码里面扣的,具体代码我没看,它肯定符合这个steps of ECMA-262标准,网页本身支持foreach的话也会实现这个标准。
嗯~~啊,dart本来是设计用来替代javascript的,猜测和上面的说法又类似的原因,建议用while或者for替代,谢谢。
对了,哥们,上面的代码
await b(5);
await b(4);
await b(3);
await b(2);
await b(1);
调用b函数之间是会堵塞的,如果多了,怕过不了review呀,大佬!!
乖乖用promise.all,谢谢,不要搞幺蛾子!
代码如下啦,promise.all类似用Future.wait
- Future b() async {
-
- var future1 = Future.delayed(Duration(milliseconds: 1), () => 1);
-
- var future2 = Future.delayed(Duration(milliseconds: 2), () {
-
- return 5;
-
- });
-
- var future3 = Future.delayed(Duration(milliseconds: 3), () => 3);
-
- var arr=await Future.wait([future1,future2,future3]);
-
- return arr;
-
- }
-
- void cc() async {
-
- var a= await b();
-
- print("异步:$a");
-
- print("最后");
-
- }
-
- cc();
结果是:
- 异步:[1, 5, 3]
-
- 最后