异步与同步
异步与同步
同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式,指后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的。 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。
同步就是你叫我去吃饭,我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。 异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。
Promise 是在 j s 中进行异步编程的新解决方案。从语法上来讲,Promise是一个对象,从它可以获取异步操作的消息。
async 是“异步”的简写, async 用于申明一个异步的 function。
await 可以认为是 async wait 的简写,await 用于等待一个异步方法执行完成。
promise
它有resolve,reject,race等静态方法;它的原型(prototype)上有then,catch方法
new Promise(function(resolve , reject){}/* excutor */);
pending: 初始状态,成功或失败状态。 fulfilled: 意味着操作成功完成。 rejected: 意味着操作失败。
调用resolve方法时,Promise的状态就变成fulfilled,即操作成功状态
调用reject方法后,Promise状态变为rejected,即操作失败状态,此时执行then方法里面onrejected操作
then方法里面有两个参数onfulfilled(Promise为fulfilled状态时执行) 和 onrejected(Promise为rejected状态时执行)
catch其实跟then方法中的第二个参数一样,就是在Promise状态为rejected时执行,then方法捕捉到Promise的状态为rejected,就执行catch方法里面的操作
Promise优缺点
优点:(1)解决回调地狱问题 ,有时我们要进行一些相互间有依赖关系的异步操作,比如有多个请求,后一个的请求需要上一次请求的返回结果。(2)更好地进行错误捕获。
缺点:(1)无法取消Promise,一旦新建它就会立即执行,无法中途取消。(2)如果不设置回调函数,promise内部抛出的错误,不会反应到外部。(3)当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)。
async/await
1.async/await是写异步代码的新方式,以前的方法有回调函数和Promise。 2.async/await是基于Promise实现的,它不能用于普通的回调函数。 3.async/await与Promise一样,是非阻塞的。 4.async/await使得异步代码看起来像同步代码,这正是它的魔力所在。
async
async是一个加在函数前的修饰符,被async定义的函数会默认返回一个Promise对象resolve的值。因此对async函数可以直接then,返回值就是then方法传入的函数。async声明的函数的返回本质是一个Promise。
await
await 也是一个修饰符,只能放在async定义的函数内。可以理解为等待。await 修饰的如果是Promise对象:可以获取Promise中返回的内容(resolve或reject的参数),且取到值后语句才会往下执行;如果不是Promise对象:把这个非promise的东西当做await表达式的结果。
Async基本语法
函数声明 async function foo() {} 函数表达式 const foo = async function () {}; 对象的方法 let obj = { async foo() {} }; obj.foo().then(...)
async/await与promise的对比
Promise的出现解决了传统callback函数导致的“地狱回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。 async await与Promise一样,是非阻塞的。 async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。