在油猴脚本开发中,掌握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 语法糖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。
掌握这些技巧后,油猴脚本中的异步流程将更清晰高效!