异步请求与Promise、async-await的总结

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

猜你喜欢

转载自blog.csdn.net/u013455430/article/details/88530613