您好,登錄后才能下訂單哦!
這篇文章主要介紹小程序中如何解決代碼同步執(zhí)行的問題,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
在做小程序的時(shí)候,是不是經(jīng)常遇到這兩種同步問題:
1.使用for循環(huán),一個(gè)循環(huán)里面的操作還沒結(jié)束,下一個(gè)循環(huán)就已經(jīng)開始了。如果循環(huán)之間沒有互相依賴,問題應(yīng)該還不大,但是如果下一個(gè)循環(huán)的開始依賴于上一個(gè)循環(huán)的結(jié)果,那這一系列操作就會(huì)出現(xiàn)問題,比如畫圖:
for (let index in images) { //每畫一張圖,都要在上一張圖畫結(jié)束才能開始,因?yàn)橐?jì)算畫圖位置 ctx.drawImage }
2.調(diào)用服務(wù)器接口訪問數(shù)據(jù)、下載圖片等,服務(wù)器還未返回?cái)?shù)據(jù),代碼已經(jīng)繼續(xù)執(zhí)行其他代碼了,這明顯會(huì)出問題。
wx.downloadFile({ url: URL, success(wr) { //如果其他執(zhí)行代碼在success代碼塊里面,還能保證在成功獲取數(shù)據(jù)后正常執(zhí)行 //如果下載功能是共用的,其他操作邏輯肯定就會(huì)抽離出來,這樣就保證不了同步執(zhí)行了。 } });
該怎么解決呢?
第一種情況,網(wǎng)上好多解決方案是加sync或者await,還有的加setInterval,這幾種方案我都沒有選,而且使用嵌套調(diào)用。
/** * 處理圖片 */ handleOneImage: function(ctx, images, idx) { let that = this; let oneImage = images[idx]; let pro = new Promise(function(resolve, reject) { if (oneImage == undefined) { //畫圖結(jié)束 //執(zhí)行一系列操作 } else { //成功畫圖結(jié)束,執(zhí)行下一張圖的操作 that.drawOneImage(ctx, oneImage, that.data.xp).then(isSuccess => { if (isSuccess == 'success') { that.handleOneImage(ctx, images, idx + 1); } }); } }); return pro; }, /** * 畫圖片 */ drawOneImage: function(ctx, image, xp) { let that = this; //保證獲取圖片信息、畫圖等操作同步進(jìn)行結(jié)束再返回結(jié)果 let pro = new Promise(function(resolve, reject) { wx.getImageInfo({ src: image, success: function(imageInfo) { let iWidth = imageInfo.width; let iHeight = imageInfo.height; let dWidth = (iWidth * 580) / iHeight; ctx.drawImage(image, xp, 0, dWidth, 580); ctx.stroke(); that.setData({ xp: that.data.xp + dWidth }); resolve('success'); } }); }); return pro; },
第二種情況:其實(shí)在解決第一種情況的代碼中,也用到了解決第二種情況的代碼,使用Promise,有需要的話可以研究下上面的代碼。
以上是“小程序中如何解決代碼同步執(zhí)行的問題”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。