Promise和async-await主要的目的是为了处理异步请求,那什么是异步请求?什么是同步请求?
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
具体的说
同步——使用者通过单个线程调用服务;该线程发送请求,在服务运行时阻塞,并且等待响应。
异步——使用者通过两个线程调用服务;一个线程发送请求,而另一个单独的线程接收响应。
同步请求和异步请求都各有千秋,但是对于请求数量过多时,如果选用同步请求,那么一个借口阻塞时会导致网站无法继续加载,那么这时候就会考虑使用异步请求的方式
首先说ES6中的Promise(承诺),需要详细学习还需要去看看阮一峰的博客,里面有详细的介绍和实例
简单理解Promise就是一个对象容器,里面保存着异步操作的结果
对象的状态不受外界影响。Promise
对象代表一个异步操作,有三种状态:pending
(进行中)、fulfilled
(已成功)和rejected
(已失败),而且Promise
对象的状态改变,只有两种可能:从pending
变为fulfilled
和从pending
变为rejected
。
当然promise也有缺点。首先,无法取消Promise
,一旦新建它就会立即执行,无法中途取消。其次,如果不设置回调函数,Promise
内部抛出的错误,不会反应到外部。第三,当处于pending
状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
基础的promise代码:
const promise = new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});
Promise
实例生成以后,可以用then
方法分别指定resolved
状态和rejected
状态的回调函数。
promise.then(function(value) {
// success
}, function(error) {
// failure
});
在这里如果在一个then方法里面出现了错误是不会被抛出异常的,需要用链式的写法去捕捉前面的异常,
someAsyncThing().then(function() {
return someOtherAsyncThing();
}).catch(function(error) {
console.log('oh no', error);
// 下面一行会报错,因为y没有声明
y + 2;
}).catch(function(error) {
console.log('carry on', error);
});
// oh no [ReferenceError: x is not defined]
// carry on [ReferenceError: y is not defined]
在Es5里有个unhandledRejection函数可以捕捉到异常错误
process.on('unhandledRejection', function (err, p) {
throw err;
});
finally
方法用于指定不管 Promise 对象最后状态如何,都会执行的操作
promise
.finally(() => {
// 语句
});
// 等同于
promise
.then(
result => {
// 语句
return result;
},
error => {
// 语句
throw error;
}
);
promise.all和promise.race就不一一介绍,阮一峰博客都有
async(异步)是寄生于promise的语法糖,可用来申明异步调用的函数,但是必须与await一起使用,单独使用await会报错
定义形式如上图,这里用react中的export的方法将函数定义,下图为调用login函数
参考博客:
https://www.jianshu.com/p/fe0159f8beb4
http://es6.ruanyifeng.com/#docs/promise