关于javascript:JavaScript-异步函数的-Promisification-处理

31次阅读

共计 1443 个字符,预计需要花费 4 分钟才能阅读完成。

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(...);

正文完
 0