中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JavaScript異步函數Promisification處理的方法

發布時間:2022-08-15 16:18:02 來源:億速云 閱讀:131 作者:iii 欄目:開發技術

這篇文章主要介紹了JavaScript異步函數Promisification處理的方法的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JavaScript異步函數Promisification處理的方法文章都會有所收獲,下面我們一起來看看吧。

前言:

Promisification 是一個很長的詞,表示一個編程范式的轉變,即將接受回調的函數轉換為一個返回類型為 Promise 的函數。

我們現實的開發項目中經常需要這種轉換,因為許多函數和庫都是基于回調的,但是 Promise 更方便,所以對它們進行 Promisification 處理是有意義的。

下面是一個簡單的例子:

function loadScript(src, callback) {
  let script = document.createElement('script');
  script.src = src;

  script.onload = () => callback(null, script);
  script.onerror = () => callback(new Error(`Script load error for ${src}`));

  document.head.append(script);
}

這段代碼,動態創建一個 script 元素,待其加載完畢后,會觸發 onload 事件指定的回調函數。

運行時,loadScript 的調用者,負責指定回調函數:

loadScript('path/script.js', (err, script) => {...})

下面我們將會對這個函數進行 Promisification 改造。

我們將創建一個新函數 loadScriptPromise(src),它執行相同的操作(加載腳本),但返回一個 Promise 而不是使用回調。

換句話說,我們只傳遞 src (沒有回調)并得到一個 Promise 作為返回參數,當加載成功時使用創建并加載好的 script 進行 resolve,否則通過 reject 拋出錯誤。

改造后的函數:

let loadScriptPromise = function(src) {
  return new Promise((resolve, reject) => {
    loadScript(src, (err, script) => {
      if (err) reject(err);
      else resolve(script);
    });
  });
};

消費代碼:

loadScriptPromise('path/script.js').then(...)

正如我們所見,新函數是原始 loadScript 函數的包裝器。

在實踐中,我們可能需要 Promisify 多個函數,所以構造一個 helper 函數顯得更有意義。

我們稱這個函數為 promisify(f):它接受一個準備被改造成 Promise 的函數 f, 并返回一個 wrapper 函數。

完整實現如下:

function promisify(f) {
  return function (...args) { // return a wrapper-function (*)
    return new Promise((resolve, reject) => {
      function callback(err, result) { // our custom callback for f (**)
        if (err) {
          reject(err);
        } else {
          resolve(result);
        }
      }
      args.push(callback); // append our custom callback to the end of f arguments

      f.call(this, ...args); // call the original function
    });
  };
}

消費代碼:

let loadScriptPromise = promisify(loadScript);
loadScriptPromise(...).then(...);

關于“JavaScript異步函數Promisification處理的方法”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JavaScript異步函數Promisification處理的方法”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

富源县| 蓬安县| 尼玛县| 闸北区| 遂平县| 永州市| 祁连县| 孟津县| 广宗县| 清远市| 罗山县| 张家口市| 鸡泽县| 昭通市| 菏泽市| 沛县| 洞口县| 清水河县| 伊宁市| 双峰县| 称多县| 绩溪县| 邹平县| 黔西县| 青铜峡市| 嘉鱼县| 马尔康县| 新宾| 慈溪市| 项城市| 宁乡县| 揭东县| 全南县| 浦北县| 尤溪县| 吴川市| 遂川县| 左权县| 尼木县| 晋江市| 南郑县|