前言: 回顾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. 页面跳转
    2. 函数调用
    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. //创建promise对象
  9. var promiseObj2 = new Promise(function(resolve,reject) {
  10. //2. 调用reject把失败的数据存储promise对象里
  11. reject('失败了');
  12. });
  13. console.log('promiseObj2',promiseObj2);
  14. //创建promise对象
  15. var flag = false;
  16. var promiseObj3 = new Promise(function(resolve,reject){
  17. if(flag) {
  18. resolve(222);
  19. }else {
  20. reject('失败了');
  21. }
  22. });
  23. console.log('promiseObj3',promiseObj3)
  24. </script>

二. 获取promise对象存储的数据

  1. <script>
  2. var boo = true;
  3. var promiseObj = 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. promiseObj.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. var promiseObj = new Promise(function(resolve,reject){
  4. $.ajax({
  5. url:'http://huruqing.cn:3000/api/film/getList',
  6. type:'get',
  7. data:{},
  8. success:function(res){
  9. resolve(res)
  10. },
  11. error:function(err){
  12. reject(err)
  13. }
  14. })
  15. })
  16. promiseObj.then(function(res){
  17. console.log(res)
  18. }).catch(function(err) {
  19. console.log(err)
  20. })
  21. </script>

四. promise 对象的三种态度

创建promise对象有三种态度
Pending 进行中,初始状态,既不是成功,也是失败状态
Resolve(已完成,又称 Fulfilled)
Reject(已失败)

  1. <script>
  2. var code = 666;
  3. //1.创建一个promise对象
  4. var promiseObj = new Promise(function (resolve, reject) {
  5. setTimeout(function(){
  6. if(code === 666){
  7. resolve({
  8. code: 666,
  9. msg: '成功了'
  10. })
  11. }else{
  12. reject({
  13. msg: '失败了'
  14. })
  15. }
  16. },2000)
  17. })
  18. // 4. promise的三种状态
  19. //a. pending
  20. console.log(promiseObj);
  21. //2秒后再查看结果
  22. setTimeout(function () {
  23. console.log(promiseObj);
  24. }, 2000)
  25. </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();
  2. 使用函数返回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. }
    17. getData2()

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

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

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

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

    七. 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 promiseObj = new Promise(function (resolve, reject) {
    6. setTimeount(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: 18
    18. })
    19. }, 3000)
    20. })
    21. //参数是一个数组,数组的成是promise对象,Promise.all也是promise对象
    22. Promise.all([promiseObj, promiseObj2]).then(function (res) {
    23. console.log(res)
    24. }).catch(function(err) {
    25. console.log(err)
    26. })
    27. </script>