• flutter,javascript forEach await无效


    我有这样的一堆代码

    1. function b(i){
    2.     return new Promise((resolve)=>{
    3.            setTimeout(()=>{
    4.                 resolve(i)
    5.            },200*(7-i))
    6.         }).then(e=>{
    7.             console.log(e)
    8.         })
    9. }
    10. async function aa(){
    11.     let i=5;
    12.     await  b(5);
    13.     await  b(4);
    14.     await  b(3);
    15.     await  b(2);
    16.     await  b(1);
    17.     console.log("最后")
    18. }
    19. aa();

    我觉得吧这样调用多次b函数有点不大合适,我就想把,能不能减少点代码量。于是用foreach来替代,

    代码变成如下:

    1. function b(i){
    2.     return new Promise((resolve)=>{
    3.            setTimeout(()=>{
    4.                 resolve(i)
    5.            },200*(7-i))
    6.         }).then(e=>{
    7.             console.log(e)
    8.         })
    9. }
    10. async function aa(){
    11.     await [1,2,3,4,5].forEach(async (i)=>{
    12.       await  b(i);
    13.     })
    14.     console.log("最后")
    15. }
    16. aa()

    结果

    “最后”第一个打印,这我觉得不符合我的需要,这问题肯定是出现在了foreach上面,但是我不知道为何。

    while

    那试试while呗,又不是不得行,于是把代码改成了如下;

    1. async function aa(){
    2.     let i=5;
    3.     while(i>0){
    4.         i--;
    5.          await  b(i);
    6.         
    7.     }
    8.     console.log("最后")
    9. }
    10. aa()

    然后它可以了。所以先暂时下个结论,某种场景下可以用while来替代foreach,就好像下面这一串代码:

    1. async function aa(){
    2.   let arr=[5,4,3,2,1];
    3.     let i=arr.length-1;
    4.    
    5.     while(i>0){
    6.         i--;
    7.          await  b(arr[I]);
    8.         
    9.     }
    10.     console.log("最后")
    11. }
    12. aa()

    for

    用for也不是不行的嘛,为何非得纠结foreach!!

    1. async function aa(){
    2.     for(let i=5;i>0;i--){
    3.         await  bb(i);
    4.         
    5.     }
    6.     console.log("最后")
    7. }
    8. aa()

    不,giegie我还是想要foreach!!

    滚~~~~~

    原因

    其实foreach用不了,它是有原因的,foreach其实是基于while二次封装的,foreach它本身是没有用到asyn去装饰的,所以在调用时候用await是无效的。

    有代码为证哈,不是我瞎掰

    1. // Production steps of ECMA-262, Edition 5, 15.4.4.18
    2. // Reference: http://es5.github.io/#x15.4.4.18
    3. if (!Array.prototype.forEach) {
    4.   Array.prototype.forEach = function(callback, thisArg) {
    5. //
    6. }

    这个代码是网友从pollyfill源码代码里面扣的,具体代码我没看,它肯定符合这个steps of ECMA-262标准,网页本身支持foreach的话也会实现这个标准。

    那为啥dart的 future await也用不了foreach呀??!!

            嗯~~啊,dart本来是设计用来替代javascript的,猜测和上面的说法又类似的原因,建议用while或者for替代,谢谢。

    疑问

    对了,哥们,上面的代码

      await  b(5);

        await  b(4);

        await  b(3);

        await  b(2);
        await  b(1);

    调用b函数之间是会堵塞的,如果多了,怕过不了review呀,大佬!!

    乖乖用promise.all,谢谢,不要搞幺蛾子!

    dart呢??

    代码如下啦,promise.all类似用Future.wait

    1. Future b() async {
    2.    var future1 =  Future.delayed(Duration(milliseconds: 1), () => 1);
    3.    var future2 =  Future.delayed(Duration(milliseconds: 2), () {
    4.      return 5;
    5.    });
    6.   var future3 =  Future.delayed(Duration(milliseconds: 3), () => 3);
    7. var arr=await Future.wait([future1,future2,future3]);
    8.   return arr;
    9. }
    10. void cc() async {
    11.    var a= await b();
    12.    print("异步:$a");
    13.    print("最后");
    14. }
    15.   cc();

    结果是:

    1. 异步:[1, 5, 3]
    2. 最后
  • 相关阅读:
    QT驾校科目考试系统——从实现到发布
    设计模式-迭代器模式
    使用 Keras 和 Tensorflow Hub 对电影评论进行文本分类
    剧院建筑三维可视化综合管控平台提高安全管理效率
    采购订单创建、修改、审批增强ME21N/ME22N/ME28/ME29N
    MATLAB基础学习笔记
    cnpm的安装与使用
    跨机器检查基于DCLI命令
    学习自动化测试该怎么学?
    人工智能|机器学习——K-means系列聚类算法k-means/ k-modes/ k-prototypes/ ......(划分聚类)
  • 原文地址:https://blog.csdn.net/u014071104/article/details/127942874