You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
functionloadScript(src,callback){letscript=document.createElement("script");script.src=src;script.onload=()=>callback(script);document.head.append(script);}loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js",(script)=>{// 在脚本加载完成后,回调函数才会执行alert(`Cool, the script ${script.src} is loaded`);alert(_);// 所加载的脚本中声明的函数});
functionloadScript(src,callback){letscript=document.createElement('script');script.src=src;script.onload=()=>callback(null,script);script.onerror=()=>callback(newError(`Script load error for ${src}`));document.head.append(script);}// 用法:loadScript('https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.2.0/lodash.js',script=>{// 在脚本加载完成后,回调函数才会执行alert(`${script.src} is loaded!`);alert(_);// 所加载的脚本中声明的函数});
基于 Promise 重写的版本:
functionloadScript(src){returnnewPromise(function(resolve,reject){letscript=document.createElement("script");script.src=src;script.onload=()=>resolve(script);script.onerror=()=>reject(newError(`Script load error for ${src}`));document.head.append(script);});}// 用法:letpromise=loadScript("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js");promise.then((script)=>alert(`${script.src} is loaded!`),(error)=>alert(`Error: ${error.message}`));promise.then((script)=>alert("Another handler..."));
回调
🚩 异步 行为(action):现在开始执行的行为,但它们会在稍后完成(例如,setTimeout 函数就是一个这样的函数;例如加载脚本和模块)
实际中的异步行为的示例:
可以像这样使用这个函数:
假设需要在新脚本加载后立即使用它,这将不会有效:
😭 到目前为止,loadScript 函数并没有提供跟踪加载完成的方法。脚本加载并最终运行,仅此而已。但是希望了解脚本何时加载完成,以使用其中的新函数和变量
💡 添加一个 callback 函数作为 loadScript 的第二个参数,该函数应在脚本加载完成时执行:
''
''这就是被称为“基于回调”的异步编程风格''
'':异步执行某项功能的函数应该提供一个 callback 参数用于在相应事件完成时调用🚩 回调地狱
如何依次加载两个脚本:第一个,然后是第二个?第三个?
加入处理 Error:
这就是著名的“
''回调地狱''
”或“厄运金字塔”💡 可以通过使每个行为都成为一个独立的函数来尝试减轻这种问题
优缺点
最好的方法之一就是 “
''promise''
”Promise
🚩 语法
🚩 立即 resolve/reject 的 Promise
🚩 示例:加载脚本的 loadScript 函数
基于回调函数的变体版本:
基于 Promise 重写的版本:
Promise 链
🚩Promise 链:回忆回调中,何依次加载两个脚本:第一个,然后是第二个?第三个?
🚩 返回 promise
示例:promise 化的 loadScript
Thenables
示例:
🚩 作为一个好的做法:异步行为应该始终返回一个 promise
示例:
错误处理
🚩Promise 链在错误(error)处理
示例:
🚩 隐式 try…catch
示例:
🚩 再次抛出(Rethrowing)
🚩 未处理的 rejection
JavaScript 引擎会跟踪此类 rejection,在这种情况下会生成一个全局的 error
Promise API
🚩Promise.all
语法
注意
🚩 如果出现 error,其他 promise 将被忽略
🚩Promise.all(iterable) 允许在 iterable 中使用 non-promise 的“常规”值
🚩Promise.allSettled
Polyfill
🚩Promise.race
示例
🚩Promise.resolve/reject
语法
示例:
Promisification
示例:
新的函数是对原始的 loadScript 函数的包装,在实际开发中,可能需要 promisify 很多函数
🚩promisify
🚩promisification 函数的模块(module)
🚩Promisification 场景
references
The text was updated successfully, but these errors were encountered: