js实现promise常用场景使用示例

简介: 本文介绍JavaScript中Promise的6种常用场景:异步请求、定时器封装、并行执行、竞速操作、任务队列及与async/await结合使用,通过实用示例展示如何优雅处理异步逻辑,避免回调地狱,提升代码可读性与维护性。

下面为你介绍 JavaScript 中 Promise 的几个些常用场景及实现示例,这些场景在实际开发中经常会遇到。

1. 异步请求处理

Promise 最常见的用途之一是处理异步请求,比如使用 fetch API 调用后端接口:

// 发起 GET 请求
fetch('https://api.example.com/data')
  .then(response => {
   
    if (!response.ok) {
   
      throw new Error('网络请求失败');
    }
    return response.json(); // 解析 JSON 数据
  })
  .then(data => {
   
    console.log('获取到的数据:', data);
    // 处理数据
  })
  .catch(error => {
   
    console.error('请求出错:', error.message);
  })
  .finally(() => {
   
    console.log('请求完成(无论成功或失败)');
  });

2. 定时器操作

使用 Promise 封装定时器,可以更优雅地处理延迟操作:

// 封装延迟函数
function delay(ms) {
   
  return new Promise((resolve) => {
   
    setTimeout(resolve, ms);
  });
}

// 使用
console.log('开始');
delay(2000)
  .then(() => {
   
    console.log('2秒后执行');
    return delay(1000);
  })
  .then(() => {
   
    console.log('再1秒后执行');
  });

3. 并行执行多个异步操作

使用 Promise.all() 可以并行执行多个异步操作,等待所有操作完成后再处理结果:

// 模拟三个异步操作
const promise1 = fetch('https://api.example.com/data1').then(res => res.json());
const promise2 = fetch('https://api.example.com/data2').then(res => res.json());
const promise3 = new Promise(resolve => setTimeout(() => resolve(3), 1000));

Promise.all([promise1, promise2, promise3])
  .then(results => {
   
    console.log('所有操作完成:', results);
    // results 是一个数组,包含三个操作的结果
  })
  .catch(error => {
   
    console.error('其中一个操作失败:', error);
  });

4. 只需要第一个完成的异步操作

使用 Promise.race() 可以等待第一个完成的异步操作:

// 模拟多个异步操作,其中一个会更快完成
const promiseA = new Promise(resolve => setTimeout(() => resolve('A完成'), 1000));
const promiseB = new Promise(resolve => setTimeout(() => resolve('B完成'), 500));
const promiseC = new Promise(resolve => setTimeout(() => resolve('C完成'), 1500));

Promise.race([promiseA, promiseB, promiseC])
  .then(result => {
   
    console.log('第一个完成的操作:', result); // 会输出 "B完成"
  });

5. 异步操作队列

通过链式调用实现异步操作的顺序执行:

// 模拟异步任务
function asyncTask(taskName, delayMs) {
   
  return new Promise(resolve => {
   
    setTimeout(() => {
   
      console.log(`任务 ${
     taskName} 完成`);
      resolve(taskName);
    }, delayMs);
  });
}

// 按顺序执行任务
asyncTask('任务1', 1000)
  .then(() => asyncTask('任务2', 500))
  .then(() => asyncTask('任务3', 1500))
  .then(() => console.log('所有任务执行完毕'));

6. 与 async/await 结合使用

Promise 与 async/await 结合可以写出更像同步代码的异步逻辑:

// 结合 async/await 使用 Promise
async function fetchData() {
   
  try {
   
    const response = await fetch('https://api.example.com/data');
    if (!response.ok) {
   
      throw new Error('网络请求失败');
    }
    const data = await response.json();
    console.log('获取到的数据:', data);
    return data;
  } catch (error) {
   
    console.error('请求出错:', error.message);
    throw error; // 可以将错误继续抛出
  } finally {
   
    console.log('请求处理完成');
  }
}

// 调用
fetchData();

这些示例覆盖了 Promise 在实际开发中的大部分常见用法。Promise 的主要优势在于能够更好地处理异步操作的流程,避免回调地狱,使代码结构更清晰、更易于维护。

目录
相关文章
|
1月前
|
API
用Promise.race()实现超时控制的代码示例
用Promise.race()实现超时控制的代码示例
244 121
|
2月前
|
前端开发 JavaScript API
JavaScript异步编程:从Promise到async/await
JavaScript异步编程:从Promise到async/await
409 204
|
11月前
|
前端开发 JavaScript
用JavaScript 实现一个简单的 Promise 并打印结果
用 JavaScript 实现一个简单的 Promise 并打印结果
|
7月前
|
缓存 自然语言处理 JavaScript
JavaScript中闭包详解+举例,闭包的各种实践场景:高级技巧与实用指南
闭包是JavaScript中不可或缺的部分,它不仅可以增强代码的可维护性,还能在模块化、回调处理等场景中发挥巨大作用。然而,闭包的强大也意味着需要谨慎使用,避免潜在的性能问题和内存泄漏。通过对闭包原理的深入理解以及在实际项目中的灵活应用,你将能够更加高效地编写出简洁且功能强大的代码。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
7月前
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
11月前
|
前端开发
Promise.race() 方法在什么场景下使用?
`Promise.race()` 方法通过其独特的竞争机制,在需要快速获取结果、设置超时控制、实现快速失败以及根据条件动态选择异步操作等场景中,能够提供简洁有效的解决方案,帮助优化异步操作的执行流程和提高系统的响应性能。
|
11月前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
10月前
纸屑飘落生日蛋糕场景js+css3动画特效
纸屑飘落生日蛋糕CSS3动画特效是一款js+css3制作的全屏纸屑飘落,生日蛋糕点亮庆祝动画特效。
132 3
|
11月前
|
前端开发 JavaScript Java
一文带你了解和使用js中的Promise
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,正向全栈进发。如果我的文章对你有帮助,请关注我,将持续更新更多优质内容!🎉🎉🎉
516 0
一文带你了解和使用js中的Promise

热门文章

最新文章