<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        微信小程序promsie.all和promise順序執行

        來源:懂視網 責編:小采 時間:2020-11-27 22:26:43
        文檔

        微信小程序promsie.all和promise順序執行

        微信小程序promsie.all和promise順序執行:微信小程序promsie.all和promise順序執行 一、前言 最近在做小程序的開發,碰到的一個需求就是表單提交,提交的表單中包含有圖片,微信這邊的做法是先上傳圖片,后臺把圖片名稱和地址返回給你,然后你把圖片信息插入到表單的相應位置再提交表單,這里就涉及
        推薦度:
        導讀微信小程序promsie.all和promise順序執行:微信小程序promsie.all和promise順序執行 一、前言 最近在做小程序的開發,碰到的一個需求就是表單提交,提交的表單中包含有圖片,微信這邊的做法是先上傳圖片,后臺把圖片名稱和地址返回給你,然后你把圖片信息插入到表單的相應位置再提交表單,這里就涉及

        微信小程序promsie.all和promise順序執行

        一、前言

        最近在做小程序的開發,碰到的一個需求就是表單提交,提交的表單中包含有圖片,微信這邊的做法是先上傳圖片,后臺把圖片名稱和地址返回給你,然后你把圖片信息插入到表單的相應位置再提交表單,這里就涉及到如何上傳完圖片的請求再上傳表單,而且微信小程序里面如果圖片是多個的話,也只能一張張上傳。簡單來說就是上傳完圖片(多個請求),拿到返回值,再上傳表單,該如何做?

        二、Promise.all和Promise.race

        先來介紹Promise.all和Promise.race方法的不同點Promise.all(iterable) 方法指當所有在可迭代參數中的 promises 已完成,或者第一個傳遞的 promise(指 reject)失敗時,返回 promise。iterable為可迭代對象,但是一般為數組。返回值也是一個Promise對象。

        需要明確的幾點,Promise.all是并發執行的同時運行多個Promise對象,而且返回的Promise對象的參數是一個數組,數組中的各項也是可迭代對象執行的順序返回。

        Promise.race(iterable) 方法返回一個新的 promise,參數iterable中只要有一個promise對象”完成(resolve)”或”失敗(reject)”,新的promise就會立刻”完成(resolve)”或者”失敗(reject)”,并獲得之前那個promise對象的返回值或者錯誤原因。所以只要iterable中有一個完成或者失敗就立即返回一個promise對象。根據race這個單詞為賽跑也能得出,最先到達的立即返回一個promise對象。

        根據上面的定義,我們采用的Promise.all方法來完成我們的需求。

        //存儲promise對象的數組
        let promiseArr = [];
        //圖片地址數組
        let imageList = [];
        //將圖片地址的上傳的promise對象加入到promiseArr
        for (let i = 0; i < imageList.length; i++) {
         let promise = new Promise((resolve, reject) => {
         //微信圖片上傳
         wx.uploadFile({
         url: 'https://xxx.xxx.xxx/api/uploadImage',
         filePath: imageList[i],
         name: 'file',
         success: function(res) {
         //可以對res進行處理,然后resolve返回
         resolve(res);
         },
         fail: function (error) {
         reject(error);
         },
         complete: function (res) {
         },
         })
         });
         promiseArr.push(promise)
        }
        //Promise.all處理promiseArr數組中的每一個promise對象
        Promise.all(promiseArr).then((result) => {
         //對返回的result數組進行處理
        })
        

        三、微信小程序的問題

        在做微信小程序的圖片上傳功能,這邊只能先上傳圖片,然后將圖片名和地址以response返回。

        這里面我們就是用了promise.all方法但是有一個問題就是,promise.all是并發執行的,但是微信小程序一次只能并發10個請求。

        對于圖片上傳,可能需要一次上傳超過10張圖片,也就是一次并發超過10個請求,這樣的話微信就會報錯

        “WAService.js:4 uploadFile:fail createUploadTask:fail exceed max upload connection count 10”。

        四、順序Promise執行處理

        因為Promise.all是同時運行多個promsie對象,所以對于這種并發的數量,小程序是有限制的,一次只能并發10個,所以如果想突破這種限制,可以進行順序執行每個Promise。

        代碼如下:

        //順序處理函數
        function sequenceTasks(tasks) {
         //記錄返回值
         function recordValue(results, value) {
         results.push(value);
         return results;
         }
         let pushValue = recordValue.bind(null, []);
         let promise = Promise.resolve();
         // 處理tasks數組中的每個函數對象
         for (let i = 0; i < tasks.length; i++) {
         let task = tasks[i];
         promise = promise.then(task).then(pushValue);
         }
         return promise;
        }
        
        //函數數組,每個函數的返回值是一個promise對象
        let promiseFuncArr = [];
        //圖片地址數組
        let imageList = [];
        //將圖片地址的上傳的函數加入到promiseFuncArr數組中
        for (let i = 0; i < imageList.length; i++) {
         let promiseTemp = function(){
         return new Promise((resolve, reject) => {
         //微信圖片上傳
         wx.uploadFile({
         url: 'https://xxx.xxx.xxx/api/uploadImage',
         filePath: imageList[i],
         name: 'file',
         success: function(res) {
         //可以對res進行處理,然后resolve返回
         resolve(res);
         },
         fail: function (error) {
         reject(error);
         },
         complete: function (res) {
         },
         })
         });
         };
         promiseFuncArr.push(promiseTemp)
        }
        
        sequenceTasks(promiseFuncArr).then((result) => {
         //對返回的result數組進行處理
        });
        
        

        1.這里解釋一下sequenceTasks函數的作用

        首先recordValue函數傳入兩個值,一個是results是返回的數組,另一個是value,value是傳入的值,results.push(value);將每一個值push到results數組,然后再返回results數組。

        let pushValue = recordValue.bind(null, []);

        pushValue也是一個函數對象,將recordValue bind到一個[ ]數組中,第一個參數傳null代表,不改變函數this的指向,所以pushValue得到就是一個function (value)的函數,參數傳入value。

        promise = promise.then(task).then(pushValue);
        

        task是函數,函數返回promise對象,在我們這里就是上傳圖片函數,每一張圖片上傳都創建一個函數,then(pushValue),pushValue是function (value)的函數,value代表的就是圖片上傳之后的返回值,pushValue將返回值push到result數組中,依次執行,依次加入到result數組中,最后返回。就可以得到一個對象數組,數組中就是依次執行返回的結果。

        2. sequenceTasks也里面的for循環,也可以寫成如下的reduce方式:

        function sequenceTasks(tasks) {
         //記錄返回值
         function recordValue(results, value) {
         results.push(value);
         return results;
         }
         let pushValue = recordValue.bind(null, []);
         return tasks.reduce(function (promise, task) {
         return promise.then(task).then(pushValue);
         }, Promise.resolve());
        }
        

        如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        微信小程序promsie.all和promise順序執行

        微信小程序promsie.all和promise順序執行:微信小程序promsie.all和promise順序執行 一、前言 最近在做小程序的開發,碰到的一個需求就是表單提交,提交的表單中包含有圖片,微信這邊的做法是先上傳圖片,后臺把圖片名稱和地址返回給你,然后你把圖片信息插入到表單的相應位置再提交表單,這里就涉及
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 精品特级一级毛片免费观看| 亚洲一线产区二线产区精华| 特级av毛片免费观看| 色婷婷7777免费视频在线观看| 久久国产亚洲电影天堂| 91视频免费网站| 亚洲老妈激情一区二区三区| 一级做a爰全过程免费视频毛片| 午夜亚洲av永久无码精品| 91麻豆最新在线人成免费观看| 亚洲国产精品无码专区| 香蕉成人免费看片视频app下载| 亚洲va久久久噜噜噜久久天堂| 亚洲av永久无码一区二区三区| 特级淫片国产免费高清视频| 亚洲欧洲av综合色无码| 国产免费69成人精品视频| 日韩久久无码免费毛片软件| 国产亚洲大尺度无码无码专线| 中文字幕一区二区免费| 亚洲一卡2卡三卡4卡有限公司| 黄色成人免费网站| 亚洲熟妇自偷自拍另欧美| 免费久久精品国产片香蕉| 国产精品福利在线观看免费不卡| 亚洲精品乱码久久久久久| 2021在线观看视频精品免费| 亚洲va精品中文字幕| 免费大黄网站在线观看| 99在线免费视频| 亚洲va在线va天堂va888www| 国产大片线上免费观看| 国内成人精品亚洲日本语音 | 成年大片免费视频| 美女视频黄.免费网址| 亚洲AV无码日韩AV无码导航| 特级做A爰片毛片免费69| 国产精品美女久久久免费 | 国产免费啪嗒啪嗒视频看看| 怡红院免费的全部视频| 亚洲成人免费电影|