收藏
回答

for循环中调用异步方法 怎么保证I的值准确?

问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 小程序 需求 wx.scanCode 工具 6.5.3 2.00

- 当前 Bug 的表现(可附上截图)

我用for 循环里面调用 wx.scanCode 这个方法,这个方法应该是异步调用的。这个时候我调用完 for 循环已经走了好几遍了 。怎么解决?

for (var i = 0; i < 5 ;i++) {

wx.scanCode({

success: (res) => {

wx.showToast({

title: '成功'+i,

icon: 'success',

duration: 2000

}

}

}

}

正常理解是调用5次 wx.scanCode, 不过wx.scanCode是异步调用,我在调用时For 还在跑吧?i一直在加,我调不到5次 怎么解决?请大神赐教,谢谢!



最后一次编辑于  2018-12-11  (未经腾讯允许,不得转载)
回答关注问题邀请回答
收藏

6 个回答

  • Chaunjie
    Chaunjie
    2018-12-13

    匿名函数是个好东西

    2018-12-13
    赞同
    回复
  • 李辉煌
    李辉煌
    2018-12-12

    感谢各位的帮助,通过你们的回复我受到启发,现在改用指针的方式实现循环了。谢谢各位。


    myscanCode: function() {

    wx.scanCode({

    success: (res) => {

    var count = this.data.scanCount;

    this.setData({

    scanCount: count + 1,

    });

    if (this.data.scanCount <= this.data.scanCountMax)

    this.myscanCode();//重复执行

    },

    fail: (res) => {},

    })

    },


    2018-12-12
    赞同
    回复
  • star
    star
    2018-12-11

    封装成函数,传参在for循环里面调用了

    for(let i = 0; i < 5; i += 1){

    myScanCode(i);

    }

    这个方法简单

    2018-12-11
    赞同
    回复
  • Charb
    Charb
    2018-12-11

    test: function() {

       const num = 5

       let count = 0

       for (var i = 0; i < num; i++) {

         wx.scanCode({

           onlyFromCamera: true,

           scanType: [],

           success: function(res) {},

           fail: function(res) {},

           complete: function(res) {

             count++

             if (count == num) {

               console.log(我执行完了)

             }

           },

         })

       }

     }


    2018-12-11
    赞同
    回复
  • pos
    pos
    2018-12-11

    封装成函数,传参在for循环里面调用了

    for(let i = 0; i < 5; i += 1){

    myScanCode(i);

    }


    2018-12-11
    赞同
    回复
  • false
    false
    2018-12-11

    for (var i = 0; i < 5; i++) {
    (function (i) {
    wx.scanCode({
    success: (res) => {
    wx.showToast({
    title: '成功' + i,
             icon: 'success',
             duration: 2000
           })
    }
    })
    })(i)
    }





    2018-12-11
    赞同
    回复 3
    • false
      false
      2018-12-11

      还可以用递归

      var f= function (i) {
      if(i===0) return;
        wx.scanCode({
      success: (res) => {
      wx.showToast({
      title: '成功' + i--,
              icon: 'success',
              duration: 2000
            },function () {
      f(i)
      })
      }
      })
      }
      f(5)


      2018-12-11
      回复
    • pos
      pos
      2018-12-11

      非要这么骚

      2018-12-11
      回复
    • false
      false
      2018-12-11回复pos

      楼楼一看就是萌新,给他多拓展拓展知识;吼吼吼

      2018-12-11
      回复