跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

JavaScript 异步函数的 Promisification 处理


KaiWn

推荐的帖子

      • 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 元素,待其加载完毕后,会触发 onl oad 事件指定的回调函数。

        运行时,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(...);
链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...