[油猴脚本开发指南]Promise常用函数与语法糖

[油猴脚本开发指南]Promise常用函数与语法糖
最新回答
最美的风信子¢

2020-12-31 19:47:28

在油猴脚本开发中,掌握Promise常用函数和语法糖(如async/await)能显著提升异步代码的可读性和可维护性。以下是关键知识点总结:

1. Promise.all
  • 功能:并行执行多个Promise,全部成功时返回结果数组,任一失败则触发catch。
  • 示例:let p1 = Promise.resolve('成功');let p2 = Promise.reject('失败');Promise.all([p1, p2]) .then(results => console.log(results)) // 不执行 .catch(error => console.log(error)); // 输出: "失败"
  • 适用场景:需要所有异步操作全部成功才能继续的逻辑(如批量请求数据)。
2. Promise.allSettled
  • 功能:无论成功或失败,等待所有Promise完成,返回状态和结果的数组。
  • 示例:const p1 = Promise.resolve(3);const p2 = Promise.reject('错误');Promise.allSettled([p1, p2]) .then(results => console.log(results));// 输出: [{status: "fulfilled", value: 3}, {status: "rejected", reason: "错误"}]
  • 适用场景:需要知道每个Promise的最终状态(如统计成功率)。
3. Promise.race
  • 功能:返回最先完成的Promise结果(无论成功或失败)。
  • 示例:const p1 = new Promise(r => setTimeout(r, 100, '快'));const p2 = new Promise((_, r) => setTimeout(r, 50, '慢'));Promise.race([p1, p2]) .then(winner => console.log(winner)); // 输出: "慢"(因reject更快) .catch(error => console.log(error));
  • 适用场景:超时控制(如设置最大等待时间)。
4. Promise.resolve/reject
  • Promise.resolve:将值包装为成功的Promise。Promise.resolve('立即成功').then(console.log); // 输出: "立即成功"
  • Promise.reject:将值包装为失败的Promise(需用catch处理)。Promise.reject('立即失败').catch(console.log); // 输出: "立即失败"
5. async/await 语法糖
  • 核心作用:用同步写法处理异步代码,必须在async函数中使用。
  • 基本用法:async function fetchData() { const data = await fetch('
    https://api.example.com'
    ); // 阻塞直到完成 return data.json();}
  • 错误处理:通过try/catch捕获await的拒绝状态。async function safeFetch() { try { const res = await fetch('无效URL'); } catch (err) { console.error('请求失败:', err); // 处理网络错误 }}
  • 注意事项

    async函数始终返回Promise,调用时需用await或.then()。

    避免在顶层直接使用await(需用IIFE包裹)。

6. 冷知识:全局await的未来
  • 目前全局作用域不能直接使用await,但可通过动态IIFE实现:(async () => { const data = await fetch('
    https://api.example.com'
    ); console.log(data);})();
  • 提案进展:ES模块顶层await已支持(需在油猴脚本中声明@grant none并使用ES模块)。
总结
  • 批量操作:用Promise.all或allSettled。
  • 竞速逻辑:用Promise.race实现超时控制。
  • 代码简洁:优先使用async/await,配合try/catch处理错误。
  • 全局异步:通过IIFE或ES模块实现顶层await。

掌握这些技巧后,油猴脚本中的异步流程将更清晰高效!