JS13 -- 同步异步

> 浏览器是多线程的,每打开一个tab就是一个线程<br/>
因为js是单线程的,一次只能执行一次任务,多个任务等待上一任务。<br/>像ajax请求这种等待服务器返回数据就会被挂起,但返回数据就会加入主线程


```
1. promise (resolve,reject)

var oPromise = new Promise(function (resolve,reject) {}); // resolve成功(.then接收),reject失败(.catch接收)
new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(true) },1000) })


Promise.all(['对象1',对象2"]).then(function () {//对象1、对象2请求成功,执行})

Promise.race(['对象1',对象2"]).then(function () {//对象1、对象2谁最快请求成功,执行})
```


<br/><br/><br/>
##### 例子: 封装一个get请求的方法

```

function getJSON(url) {
  return new Promise(function(resolve, reject) {
    var XHR = new XMLHttpRequest();
      XHR.open('GET', url, true);
      XHR.send();

      XHR.onreadystatechange = function() {
        console.log(XHR)
          if (XHR.readyState === 4 && XHR.status == 200) {
            try {
              console.log(XHR.statusText)
              var response = JSON.parse(XHR.responseText);
              resolve(response);
            } catch (e) {
              reject(e);
            }
          } else {
            reject(new Error(XHR.statusText));
      }
  }
})
}

 

let url = 'http://wthrcdn.etouch.cn/weather_mini?citykey=101070101';
getJSON(url).then(res => console.log(res));

```


<br/><br/><br/>
##### 参考
[原生ajax请求与Promise请求](https://blog.csdn.net/qq_29849641/article/details/69233788)

[Javascript异步编程的4种方法: 回调、监听addEventListener、发布/订阅、Promise](http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html)

[promise](https://es6.ruanyifeng.com/#docs/promise)

[async 函数的含义和用法](http://www.ruanyifeng.com/blog/2015/05/async.html)

posted @ 2019-12-25 10:04  Yo!  阅读(294)  评论(0)    收藏  举报