前言: 回顾js的作用: 存储数据, 传输数据, 处理数据, 展示数据

  1. 存储数据有哪些方式(套路)

    1. var a = 222; // 变量
    2. var arr = [1,23,3]; // 数组
    3. var obj = {name:'zs'}; // 对象
    4. data-index=222 // 定义属性
    5. // 读取数据的方式
    6. console.log(a);
    7. arr[0];
    8. obj.name;
    9. $(选择器).data('index');
  2. 传输数据有哪些方式

    1. (1)页面跳转
    2. (2)函数调用
    3. (3)调用接口: 把数据从服务器传输到前端

    promise是用来存储数据, 它有它自己存和取的方式

promise是什么:

所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。promise是异步编程的一种解决方案。

(一) 创建promise对象和存储数据

  1. <script>
  2. // 创建promise对象
  3. var promiseObj = new Promise(function(resolve, reject) {
  4. // 2. 调用resolve把成功的数据存储到promise对象里
  5. resolve(222);
  6. });
  7. console.log('promiseObj', promiseObj);
  8. console.log('\n-----------------------')
  9. // 创建promise对象
  10. var promiseObj2 = new Promise(function(resolve, reject) {
  11. // 2. 调用reject把失败的数据存储到promise对象里
  12. reject('失败了');
  13. });
  14. console.log('promiseObj2', promiseObj2);
  15. console.log('\n-----------------------')
  16. // 创建promise对象
  17. var flag = false;
  18. var promiseObj3 = new Promise(function(resolve, reject) {
  19. if (flag) {
  20. resolve(222);
  21. } else {
  22. reject('失败了');
  23. }
  24. });
  25. console.log('promiseObj3', promiseObj3);
  26. </script>

(二) 获取promise对象存储的数据

  1. <script>
  2. var boo = false;
  3. var promseObj = new Promise(function(resolve, reject) {
  4. if (boo) {
  5. resolve({
  6. name: 'zs'
  7. });
  8. } else {
  9. reject({
  10. msg: '失败了'
  11. })
  12. }
  13. })
  14. // 获取promiseObj对象的数据,then获取成功的信息,catch获取失败的信息
  15. promseObj.then(function(result) {
  16. console.log(result);
  17. }).catch(function(error) {
  18. console.log(error);
  19. })
  20. </script>

(三) 使用promise对象存储异步请求结

  1. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  2. <script>
  3. // 1. new一个promise对象
  4. var promiseObj = new Promise(function(resolve, reject) {
  5. $.ajax({
  6. url: 'http://huruqing.cn:3000/api/film/getList',
  7. data: {},
  8. type: 'get',
  9. success(res) {
  10. resolve(res);
  11. },
  12. error: function(err) {
  13. reject(err);
  14. }
  15. })
  16. })
  17. // 2. 获取数据
  18. promiseObj.then(function(res) {
  19. console.log(res);
  20. }).catch(function(err) {
  21. console.log(err);
  22. })
  23. </script>

(四) promise对象的三种状态

创建promise对象有三种状态

  • Pending 进行中,初始状态,既不是成功,也不是失败状态
  • Resolved(已完成,又称 Fulfilled)
  • Rejected(已失败)
  1. <script>
  2. var code = 666;
  3. // 1. 创建一个promise对象
  4. var promiseObj = new Promise(function(resolve, reject) {
  5. // 2. 调用resolve把成功的数据存储到promise对象里
  6. setTimeout(function() {
  7. if (code === 666) {
  8. resolve({
  9. code: 6666,
  10. msg: '成功了'
  11. });
  12. } else {
  13. // 3. 调用reject把失败的数据存储到promise对象里
  14. reject({
  15. msg: '失败了'
  16. })
  17. }
  18. }, 2000);
  19. });
  20. // 4. promise的三种状态
  21. // a. pending
  22. console.log(promiseObj);
  23. // 2秒后再查看结果
  24. // b.Resolved或Rejected
  25. setTimeout(function() {
  26. console.log(promiseObj);
  27. }, 2000)
  28. </script>

(五) 配合async await使用可以使异步变同步

  1. async await 举例:
  1. // 1. 创建一个函数,在function前面加上async
  2. async function getData() {
  3. // 2. 创建一个promise对象,并存储数据
  4. var promiseObj = new Promise(function(resolve, reject) {
  5. setTimeout(function() {
  6. resolve({
  7. msg: 'success'
  8. });
  9. }, 2000)
  10. })
  11. // 3. 用await等待结果, 有了结果之后再执行
  12. var result = await promiseObj;
  13. console.log(result);
  14. }
  15. getData();
  1. 使用函数返回promise对象

    1. // 项目中一般使用一个函数来返回一个promise对象
    2. function getObj() {
    3. var promiseObj = new Promise(function(resolve, reject) {
    4. setTimeout(function() {
    5. resolve({
    6. msg: 'success'
    7. });
    8. }, 2000)
    9. })
    10. return promiseObj;
    11. }
    12. async function getData2() {
    13. // 调用getObj()得到一个promise对象, 使用await等待它结果
    14. var result = await getObj();
    15. console.log(result);
    16. }

(六) promise配合async await的好处: 可以避免回调地狱

1. 回调函数, 回调地狱是什么

2. 使用async await解决回调地狱

  1. // async await应用,可以避免过多的回调函数(俗称回调地狱), 下面是使用async await对上面代码进行改造
  2. // 1. 封装ajax方法
  3. function getData(url, data) {
  4. // 2.使用promise对象存储请求结果
  5. var promiseObj = new Promise(function(resolve, reject) {
  6. $.ajax({
  7. url: url,
  8. data: data,
  9. type: 'get',
  10. dataType: 'json',
  11. success: function(res) {
  12. resolve(res);
  13. },
  14. error: function(err) {
  15. reject(err);
  16. }
  17. })
  18. })
  19. return promiseObj;
  20. }
  21. // 2.获取电影详情
  22. async function getDetail() {
  23. // (1).请求电影列表
  24. var url = 'http://huruqing.cn:3000/api/film/getList';
  25. var data = {};
  26. var result1 = await getData(url, data);
  27. // 查找流浪地球的那部电影
  28. var filmList = result1.films;
  29. var film = filmList.find(function(item) {
  30. return item.name === '流浪地球';
  31. });
  32. // (2).请求电影详情
  33. var url = 'http://huruqing.cn:3000/api/film/getDetail';
  34. var data = {
  35. filmId: film.filmId
  36. };
  37. var result2 = await getData(url, data);
  38. console.log('流浪地球的详情是:', result2);
  39. }
  40. getDetail();

(七) promise.all可以使多个请求结果都返回后再处理

  1. // 请求参数为1个数组,数组的成员为promise独享
  2. promise.all([promise1,promise2,promise3]);
  1. <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  2. <script>
  3. // 1.创建二个promise对象
  4. // 2. 使用promise.all获取二个promise对象存储的值
  5. var promiseObj1 = new Promise(function(resolve, reject) {
  6. setTimeout(function() {
  7. resolve({
  8. name: '张三',
  9. age: 18
  10. });
  11. }, 1000)
  12. })
  13. var promiseObj2 = new Promise(function(resolve, reject) {
  14. setTimeout(function() {
  15. resolve({
  16. name: '李四',
  17. age: 22
  18. });
  19. }, 3000)
  20. })
  21. // 参数是一个数组, 数组的成是promise对象,Promise.all也是promise对象
  22. Promise.all([promiseObj1, promiseObj2]).then(function(res) {
  23. console.log(res);
  24. }).catch(function(err) {
  25. console.log(err)
  26. });
  27. </script>