首頁 web前端 js教程 promsie.all和promise順序執行詳解

promsie.all和promise順序執行詳解

Jan 20, 2018 am 11:50 AM
ie 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: &#39;https://xxx.xxx.xxx/api/uploadImage&#39;,
      filePath: imageList[i],
      name: &#39;file&#39;,
      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: &#39;https://xxx.xxx.xxx/api/uploadImage&#39;,
        filePath: imageList[i],
        name: &#39;file&#39;,
        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());
}
登入後複製

相關推薦:

headjs實作網站並行載入但順序執行JS

#Java中類別的載入順序執行結果詳細介紹

JS的程式碼執行有哪些先後順序

#

以上是promsie.all和promise順序執行詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) win11無法使用ie11瀏覽器怎麼辦? (win11用不了ie瀏覽器) Feb 10, 2024 am 10:30 AM

越來越多的用戶開始升級win11系統,由於每個用戶的使用習慣不同,還是有不少用戶在使用ie11瀏覽器,那麼win11系統用不了ie瀏覽器,該怎麼辦呢? windows11還支援ie11嗎?下面就來看看解決方法。 win11無法使用ie11瀏覽器的解決方法1、先右鍵開始選單,選擇「命令提示字元(管理員)」開啟。 2.開啟之後,直接輸入“Netshwinsockreset”,回車確定。 3.確定之後再輸入「netshadvfirewallreset&rdqu

Internet Explorer 開啟 Edge:如何停止 MS Edge 重新導向 Internet Explorer 開啟 Edge:如何停止 MS Edge 重新導向 Apr 14, 2023 pm 06:13 PM

長期以來,InternetExplorer的失寵一直不是秘密,但隨著Windows11的到來,現實開始了。 Edge將來不再有時取代IE,它現在是微軟最新作業系統中的預設瀏覽器。目前,您仍然可以在Windows11中啟用InternetExplorer。但是,IE11(最新版本)已經有了一個正式的退役日期,即2022年6月15日,時間在流逝。考慮到這一點,您可能已經注意到InternetExplorer有時會打開Edge,而您可能不喜歡它。那為什麼會這樣呢?在

言出必行:兌現承諾的好處和壞處 言出必行:兌現承諾的好處和壞處 Feb 18, 2024 pm 08:06 PM

在日常生活中,我們常常會遇到承諾與兌現之間的問題。無論是在個人關係中,或是在商業交易中,承諾的兌現都是建立信任的關鍵。然而,承諾的利與弊也常常會引起爭議。本文將探討承諾的利與弊,並給予一些建議,如何做到言出必行。承諾的利是顯而易見的。首先,承諾可以建立信任。當一個人信守承諾時,他會讓別人相信自己是個可信賴的人。信任是人與人之間建立的紐帶,它可以讓人們更加

在Vue應用中遇到Uncaught (in promise) TypeError怎麼辦? 在Vue應用中遇到Uncaught (in promise) TypeError怎麼辦? Jun 25, 2023 pm 06:39 PM

Vue是一款受歡迎的前端框架,在開發應用時經常會遇到各種各樣的錯誤和問題。其中,Uncaught(inpromise)TypeError是常見的一種錯誤型別。在本篇文章中,我們將探討它的產生原因和解決方法。什麼是Uncaught(inpromise)TypeError? Uncaught(inpromise)TypeError錯誤通常出現在

深入了解Promise.resolve() 深入了解Promise.resolve() Feb 18, 2024 pm 07:13 PM

Promise.resolve()詳解,需要具體程式碼範例Promise是JavaScript中一種用來處理非同步操作的機制。在實際開發中,常常需要處理一些需要依序執行的非同步任務,而Promise.resolve()方法就是用來傳回一個已經Fulfilled狀態的Promise物件。 Promise.resolve()是Promise類別的靜態方法,它接受一個

Win10開啟IE自動跳到Edge怎麼取消_IE瀏覽器頁​​面自動跳轉的解決方法 Win10開啟IE自動跳到Edge怎麼取消_IE瀏覽器頁​​面自動跳轉的解決方法 Mar 20, 2024 pm 09:21 PM

近期不少的win10用戶們在使用電腦瀏覽器的時候發現自己的ie瀏覽器總是自動的跳到edge瀏覽器,那麼win10打開ie自動跳轉edge怎麼關閉?。下面就讓本站來為用戶們來仔細的介紹一下win10打開ie自動跳轉edge關閉方法吧。 1.我們登入edge瀏覽器,點選右上角...,找下拉的設定選項。 2.我們進入設定後,在左側欄點選預設瀏覽器。 3.最後我們在相容性中,勾選不允許IE模式下重新載入網站,重啟ie瀏覽器即可。

ie快捷方式無法刪除如何解決 ie快捷方式無法刪除如何解決 Jan 29, 2024 pm 04:48 PM

ie捷徑無法刪除的解決方法:1、權限問題;2、捷徑損壞;3、軟體衝突;4、登錄問題;5、惡意軟體;6、系統問題;7、重新安裝IE;8、使用第三方工具;9、檢查捷徑的目標路徑;10、考慮其他因素;11、諮詢專業人士。詳細介紹:1、權限問題,右鍵點擊快捷方式,選擇“屬性”,在“安全性”選項卡中,確保有足夠的權限刪除該快捷方式,如果沒有,可以嘗試以管理員身份運行等等。

一個時代的結束:Internet Explorer 11 已退役,這是你需要知道的 一個時代的結束:Internet Explorer 11 已退役,這是你需要知道的 Apr 20, 2023 pm 06:52 PM

2022年6月15日是Microsoft結束對InternetExplorer11(IE11)的支援並關閉其舊版瀏覽器章節的日子。一段時間以來,該公司一直在提醒用戶注意這一生命週期結束日期,並呼籲他們計劃遷移到MicrosoftEdge。 Microsoft將IE11與Windows8.1捆綁在一起,作為Windows的現代預設網頁瀏覽器。儘管它從未達到Chrome的(目前)高度,但它是2014年使用量第二大的桌面瀏覽器,僅次於IE8。當然,隨著20

See all articles