Promise

  1. const asyncImg = (url) => (
  2. new Promise((resolve, reject) => {
  3. const image = new Image();
  4. image.onload = () => {
  5. resolve(image);
  6. };
  7. image.onerror = (err) => {
  8. reject(err);
  9. };
  10. image.src = url
  11. })
  12. )
  13. asyncImg('https://imgm.gmw.cn/attachement/jpg/site2/20200501/f832e46f786d20163c0c37.jpg');
  1. const getJson = (url) => (
  2. new Promise((resolve, reject) => {
  3. const handler = function () {
  4. if (this.readyState !== 4) {
  5. return;
  6. }
  7. if (this.status === 200) {
  8. resolve(this.response);
  9. } else {
  10. reject(new Error(this.statusText))
  11. }
  12. };
  13. const client = new XMLHttpRequest();
  14. client.open('GET', url);
  15. client.onreadystatechange = handler;
  16. client.responseType = 'json';
  17. client.setRequestHeader('Accept', 'application/json');
  18. client.send();
  19. })
  20. );
  21. getJson('http://api.qingyunke.com/api.php?key=free&appid=0&msg=鹅鹅鹅');
  1. // JSONP 处理跨域
  2. const handler = (res) => {
  3. console.log(res);
  4. }
  5. const JSONP = (url) => {
  6. const script = document.createElement('script');
  7. script.src = `${url}&callback=${handler}`;
  8. document.body.insertBefore(script, document.body.firstChild);}
  9. JSONP('http://api.qingyunke.com/api.php?key=free&appid=0&msg=鹅鹅鹅');

p1 的状态决定了 p2 的状态。如果p1的状态是 pending,那么 p2 的回调函数就会等待 p1 的状态改变;如果p1的状态已经是 Resolved 或者是 Rejected, 那么回调函数将会立刻执行。

  1. const p1 = new Promise((resolve, reject) => {
  2. setTimeout(() => {
  3. resolve(1);
  4. }, 3000);
  5. });
  6. const p2 = new Promise((resolve, reject) => {
  7. setTimeout(() => {
  8. resolve(p1);
  9. }, 1000);
  10. });
  11. p2.then(res => console.log(res)).catch(err => console.log('err', err));