Vue 框架学习(九) Promise

参考视频:https://www.bilibili.com/video/BV15741177Eh?p=125

回调地狱

setTimeout(() => {
  console.log("Hello World");

  setTimeout(() => {
    console.log("Hello Vue");

    setTimeout(() => {
      console.log("Hello Python");
    }, 1000);
  }, 1000);
}, 1000);
View Code

 

Promise链式结构

new Promise((resolve, reject) => {
  // 第一次网络请求
  setTimeout(() => {
    resolve()
  }, 1000);
}).then(() => {
  // 第一次拿到结果的代码
  console.log("Hello World");
  console.log("Hello World");
  console.log("Hello World");
  console.log("Hello World");
  console.log("Hello World");

  return new Promise((resolve, reject) => {
    // 第二次网络请求
    setTimeout(() => {
      resolve()
    }, 1000);
  })
}).then(() => {

  // 第二次拿到结果的代码
  console.log("Hello Vue");
  console.log("Hello Vue");
  console.log("Hello Vue");
  console.log("Hello Vue");
  console.log("Hello Vue");

  return new Promise((resolve, reject) => {
    // 第三次网络请求
    setTimeout(() => {
      resolve()
    }, 1000);
  })
}).then(() => {

  // 第三次拿到结果的代码
  console.log("Hello Python");
  console.log("Hello Python");
  console.log("Hello Python");
  console.log("Hello Python");
  console.log("Hello Python");
})
View Code

 

Promise三种状态

 

1、基本使用(可直接看第四种)

<body>
  <script>
    // 参数->函数(resolve,reject)都是函数
    // 1、连式结构
    new Promise((resolve, reject) => {
      // 回调地狱
      // setTimeout(() => {
      //   console.log("Hello World");

      //   setTimeout(() => {
      //     console.log("Hello Vue");

      //     setTimeout(() => {
      //       console.log("Hello Python");
      //     }, 1000);
      //   }, 1000);
      // }, 1000);

      // 第一次网络请求
      setTimeout(() => {
        resolve()
      }, 1000);
    }).then(() => {

      // 第一次拿到结果的代码
      console.log("Hello World");
      console.log("Hello World");
      console.log("Hello World");
      console.log("Hello World");
      console.log("Hello World");

      return new Promise((resolve, reject) => {

        // 第二次网络请求
        setTimeout(() => {
          resolve()
        }, 1000);
      })

    }).then(() => {

      // 第二次拿到结果的代码
      console.log("Hello Vue");
      console.log("Hello Vue");
      console.log("Hello Vue");
      console.log("Hello Vue");
      console.log("Hello Vue");

      return new Promise((resolve, reject) => {

        // 第三次网络请求
        setTimeout(() => {
          resolve()
        }, 1000);
      })
    }).then(() => {

      // 第三次拿到结果的代码
      console.log("Hello Python");
      console.log("Hello Python");
      console.log("Hello Python");
      console.log("Hello Python");
      console.log("Hello Python");
    })

    // 2、
    // 网络请求:aaa -> 处理
    // 处理:aaa111 -> 处理
    // 处理:aaa222 -> 处理
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000);
    }).then(res => {
      // 1.第一次10行代码
      console.log(res, '第一层10行代码');

      // 2.对结果进行第一次处理
      // 只有resolve可省略reject
      return new Promise((resolve) => {
        resolve(res + '111')
      })
    }).then(res => {
      // 1.第二次10行代码
      console.log(res, '第二层10行代码');

      return new Promise((resolve) => {
        resolve(res + '222')
      })
    }).then(res => {
      console.log(res, '第三层10行代码');
    })


    // 3.第二种简写
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000);
    }).then(res => {
      // 1.第一次10行代码
      console.log(res, '第一层10行代码');

      // 2.对结果进行第一次处理
      return Promise.resolve(res + '111')
    }).then(res => {
      // 1.第二次10行代码
      console.log(res, '第二层10行代码');

      return Promise.resolve(res + '222')
    }).then(res => {
      console.log(res, '第三层10行代码');
    })

    // 4.简写
    new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('aaa')
      }, 1000);
    }).then(res => {
      // 1.第一次10行代码
      console.log(res, '第一层10行代码');

      // 2.对结果进行第一次处理
      // return res + '111'

      // 如果报错则在此层终止
      // return Promise.reject('error message')
      throw 'error message'
    }).then(res => {
      // 1.第二次10行代码
      console.log(res, '第二层10行代码');

      return res + '222'
    }).then(res => {
      console.log(res, '第三层10行代码');
    }).catch(err => {
      console.log(err);
    })
  </script>
</body>
View Code

 

2、race方法(多个请求中一个成功就返回)

let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)  // 打开的是 'failed'
})
View Code

 

3、all方法(多个请求都成功才返回)

Promise.all([
  // 请求1
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({
        name: 'BlackAngel',
        age: 20
      })
    }, 1500);
  }),
  // 请求2
  new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({
        name: 'Smallstars',
        age: 18
      })
    }, 1000);
  })
]).then(results => {
  console.log(results);
})
View Code

 

posted @ 2020-08-20 17:40  北冥雪  阅读(215)  评论(0编辑  收藏  举报