首页 > 其他分享 >将使用回调函数作为参数的函数改造为返回 Promise 的一个具体例子

将使用回调函数作为参数的函数改造为返回 Promise 的一个具体例子

时间:2022-08-15 10:37:32浏览次数:56  
标签:function resolve 函数 script callback 例子 Promise

我开发了一个函数 loadScript,可以动态加载指定的本地 JavaScript 文件。
源代码如下:

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);
}

然后开发一个函数 promisify,可以将任意传递进来的函数 f,改造成返回参数类型为 Promise 的新函数。

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("1.js").then((script) => { console.log('loaded:', script); hello();});

其中 1.js 的内容:

function hello(){
	console.log("hello!");
}

下面我们进行单步调试。

待改造的 loadScript,包含两个函数:

调用 promisify,返回一个新的函数。

这个新的函数包含一个闭包 f,可以调用没有 promisify 之前的旧函数。

使用这个新函数加载 1.js:

进入这个新函数内部,执行 executor body:

在函数体内部可以随时访问 callback:

我们期望 script onl oad 事件发生时,会使用 Promise 自带的 resolve 和 reject 传递参数,因此自己编写了一个 callback 函数,在这个 callback 函数里,使用 Promise 的 resolve 投递结果。

并且期望将这个 callback 函数,传递给原始的 loadScript 函数内部。我们通过 function 原型链上的 call 函数,就达到了调用原始的 loadScript 函数的目的。

并且此时的 callback 函数,确实是我们在 promisify 函数内编写的使用 Promise resolve 传递结果的函数。

稍后,script.onload 异步触发:

通过 resolve,将加载完毕的 script 元素,传递给 promise 对象通过 then 注册的回调函数。

标签:function,resolve,函数,script,callback,例子,Promise
From: https://www.cnblogs.com/sap-jerry/p/16587348.html

相关文章

  • Promise 静态 API 的使用方法
    Promise.all使用场景:假设我们希望许多Promise并行执行,并等待它们都准备好。一个实际例子是:并行下载多个URL,并在这些URL全部下载完成后,再进行后续的业务逻辑处理。......
  • Promise.all API 的出错处理
    Promise.all使用场景:假设我们希望许多Promise并行执行,并等待它们都准备好。一个实际例子是:并行下载多个URL,并在这些URL全部下载完成后,再进行后续的业务逻辑处理。......
  • 函数
    ##函数#创建和调用函数defmyfunc():passmyfunc()defmyfunc():foriinrange(3):print("Iloveyou")myfunc()IloveyouIloveyouIloveyou#函......
  • django中视图函数的FBV和CBV
    1.什么是FBV和CBVFBV是指视图函数以普通函数的形式;CBV是指视图函数以类的方式。2.普通FBV形式defindex(request):returnHttpResponse('index')3.CBV形式3.1CBV形......
  • Python 内置函数getattr()
    优点可消除if...else Python面向对象中的反射通过字符串的形式操作对象的属性,trueorfalsePython中一切皆为对象,所以只要是对象都可以使用反射比如:实例对象、......
  • FB(S1C1): PInvokeStackImbalance对PInvoke函数的调用导致堆栈不对称
    FB(S1C1):PInvokeStackImbalance对PInvoke函数的调用导致堆栈不对称 问题:    C#语言对C语言导出函数进行调用时报出的错误. 方案:   设置调用约定Call......
  • CGO,基本数据类型转换2 和 函数调用
    CGO涉及的数据类型转换包含一下内容:数值类型字符串和切片类型结构体、联合体、枚举类型‘数组类型指针类型数组和指针间的转换切片和切片之间的转换前面3个咱......
  • 函数
    函数概述函数就是多行代码的抽取(多行代码会构成特定的功能)也叫方法;优点:减少冗余代码(重复代码放在函数里面,需要时调用)函数封装(特定的一些代码使用函数包起来)提高代码......
  • 常函数
    classPerson{public://this指针的本质是指针常量指针的指向是不可以修改的//constPerson*constthis;//在成员函数后面加const修饰的是this指......
  • 函数式接口:Function
    Function接口Function接口在java中主要用来转换类型通过调用apply方法将T类型转换为R类型抽象方法:applyRapply(Tvar1);代码样例publicclassMain{publics......