javascript - 关于一段 for 循环代码执行顺序的问题
问题描述
在微信小程序里边实现点击 canvas 将其转换为图片再预览的功能,由于涉及异步方法在for循环里调用,参考网上建议,在for循环内部使用了一个立即执行函数,多次测试发现,有时候控制台会先打印出'loop index is 1', 再打印出'loop index is 0',(为方便起见,model长度为2),导致这样一种情况:你点击第一张canvas,结果预览的却是第二张,百思不得其解,望大神赐教。
<canvas wx:for='{{ model }}' bindtap='previewImg' canvas- data-index='{{ index }}'/>
// 点击图片进行预览 previewImg: function (e) { var tempFilePathList = []; var index = e.target.dataset.index; var self = this; var loopedModel = self.data.model; for (var i = 0; i < loopedModel.length; i++) { (function (a) {wx.canvasToTempFilePath({ canvasId: ’mycanvas’ + a, success: function (res) { console.log(’loop index is ’ + a); tempFilePathList.push(res.tempFilePath); if (a == loopedModel.length - 1) { // 循环到最后一个了 console.log(’current image is ’ + tempFilePathList[index]); wx.previewImage({current: tempFilePathList[index], // 当前显示图片的http链接urls: tempFilePathList // 需要预览的图片http链接列表 }) } }, fail: function (res) { console.log(res); }}); }(i)) } },
问题解答
回答1:这很正常,异步返回的时间具有不确定性,所以如果你同时有两个异步方法,返回的先后顺序也是不确定的。微信我没做过,但应该也支持h5的同步方法,你可以试一下,不行的话加个变量控制,当请求队列里有多个未返回时,你只显示最后一个,其他的不让显示。
相关文章:
1. javascript - 百度坐标,返回目标附近有哪些坐标2. javascript - 关于jsp中嵌入js代码的问题3. javascript - html5多个label中其中一个触发change,如何判断是哪一个出发了change4. javascript - 有一个异步获取数据的函数A,其他依赖这个A得到的数据的函数是否都必须是异步的?5. javascript - 关于fullpage.js的横向滚动控制6. javascript - 有什么兼容性比较好的办法来判断浏览器窗口的类型?7. javascript - 判断用户网络环境8. clone - git sourceTree克隆仓库时,都不停弹出Password Required弹窗,即时输入正确的git账号密码还是弹出9. javascript - 一个JS多元运算符的问题10. angular.js - angurlarJS的安卓的微信端中用加载ngCookies会出错的问题

网公网安备