- 微信登录后才能进行查看好友列表,是按照顺序进行的,这是同步。异步是在登录的结果不确定的时候就可以访问好友列表,是异步。从原则上讲。两个问题是可以进行异步的。
异步的时候 .then执行的是正确的结果,.error执行的是错误的结果,比如我查看公众号成功或者失败,在这个基础上还可以在里面继续写.then/.error.这就是链式调用。
.then(.then/.error) .error(.then/,error)
为了把异步变成同步,引入了 Await函数。但是出现了一些问题:在变成同步的时候,我不能在访问公众号的同时访问朋友圈。这相当于生硬的把可以异步的东西变成同步了。所以引入了 Promote。
Promise是把同步变成异步。在登录成功之后(总体同步),把硬性的<同步变异步>纠正(在访问公众号的同时也可以访问朋友圈),使得再次异步(相当于把登录后的东西变成一个组,组内异步)。由于JS是单线程的,如果只能同步执行,其他所有线程都需要进行等待,这是最坏的打算。Promise是引入来将线程进行局部异步的,从而将阻塞事件进行缩短。 比如 X和Y的执行,如果X时间长,两个使用的时间是在(X,X+Y)之间。 从编程角度来看,没有阻塞,从客户角度看,阻塞依然存在。
Promise().then() Promise().error()

Promise的优势:
1.如果只能同步执行,只能 A(B(C)),A的请求等待B的结果,B的结果等待C的结果,即避免多层嵌套,可读性和维护性都很差。
使用了Promise,A的执行可以不等待C的结果,异步进行。大大提高了效率、可读性、维护性等。
firstAsync().then(function(data){//处理得到的 data 数据//....return secondAsync();}).then(function(data2){//处理得到的 data2 数据//....return thirdAsync();}).then(function(data3){//处理得到的 data3 数据//....});
2.更好的捕获错误。
// 失败情况function fetch(callback) {setTimeout(() => {throw Error('请求失败')}, 2000)}try {fetch(() => {console.log('请求处理') // 永远不会执行})} catch (error) {console.log('触发异常', error) // 永远不会执行}// 程序崩溃// Uncaught Error: 请求失败(2)如果使用 promises 的话,通过 reject 方法把 Promise 的状态置为 rejected,这样我们在//then 中就能捕捉到,然后执行“失败”情况的回调。function fetch(callback) {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求失败');}, 2000)})}fetch().then(function(data){console.log('请求处理');console.log(data);},function(reason, data){console.log('触发异常');console.log(reason);});//当然我们在 catch 方法中处理 reject 回调也是可以的。function fetch(callback) {return new Promise((resolve, reject) => {setTimeout(() => {reject('请求失败');}, 2000)})}fetch().then(function(data){console.log('请求处理');console.log(data);}).catch(function(reason){console.log('触发异常');console.log(reason);});
- Promise缺点:无法取消。一旦新建会立即执行,不会中途取消。
- Promise风格API跟回调风格的API不同,它的参数跟同步的API是一致的,但是它的返回值是个Promise对象,要想得到真正的结果,需要在then的回调里面拿到。
