美文网首页
JavaScript 异步函数的 Promisification

JavaScript 异步函数的 Promisification

作者: 华山令狐冲 | 来源:发表于2022-08-15 10:09 被阅读0次

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

    Promisification 是一个很长的词,表示一个编程范式的转变,即将接受回调的函数转换为一个返回类型为 P...

  • part1整理

    函数式编程:JavaScript函数式编程指南 异步编程:异步编程 Promise源码 JavaScript基础知...

  • 【Dart】异步函数

    异步函数 JavaScript中,异步调用通过Promise来实现async函数返回一个Promise。await...

  • Async/Await 函数用法

    JavaScript编程异步操作解决方案:回调函数 => Promise对象 => Generator函数 => ...

  • Nodejs 请求中的异步陷阱

    异步和回调 JavaScript中有一些居家旅行必备的异步函数, 例如 setInterval, setTimeo...

  • javascript之异步函数

    这篇文章详细讲解了JavaScript中的异步函数。 JavaScript中的异步代码在很短的时间内从回调发展为P...

  • 含答案的面试题总结

    1. 说说JavaScript中有哪些异步编程方式? 1. 回调函数 回调函数是异步编程的基本方法。其优点是易编写...

  • 《全栈工程师修炼指南》学习笔记 15

    异步编程 JavaScript 回调函数容易引起回调地狱 后来有了 Promise,可以将回调函数以 then 的...

  • Javascript 异步函数的for循环

    在开发tphelper项目的时候,遇到一个这样的问题,因为接口请求失败次数过多,要求接口请求5次都失败才弹窗提示用...

  • js异步、同步函数

    简单来说: 使用回调函数、延迟器就是异步函数,否则就同步函数 Javascript语言的执行环境是"单线程" 所谓...

网友评论

      本文标题:JavaScript 异步函数的 Promisification

      本文链接:https://www.haomeiwen.com/subject/numhgrtx.html