fetch是个典型的Promise,在当前页打开chrom控制台,输入下面的代码查看输出结果
fetch('/').then(res=>res.text()).then(data=>console.log(data.length)) 复制代码
setTimeout是典型的异步函数,使用一个回调函数作为参数 这里会返回一个正整数,表示定时器的编号
setTimeout( function () { console.log('123') }, 1000 ) 复制代码
用Math.random生成rnd 如果rnd大于0.5则resolve(rnd),否则reject(rnd) 一个new Promise是一个立执行的函数,要有then和catch
new Promise((resolve,reject)=>{ setTimeout(()=>{ let rnd = Math.random() if(rnd > 0.5) resolve(rnd) else reject(rnd) }, 1000) }) .then(res=>console.log('resolve=', res)) .catch(err=>console.log('reject=', err)) 复制代码
只需要用普通函数封装new Promise 不立刻执行的promise,不需要then和catch,在调用的时候补充即可
let p1 = ()=> new Promise((res,rej)=> setTimeout(()=>{ let rnd = Math.random() if(rnd > 0.5) res(rnd) else rej(rnd) }, 1000) ) 复制代码
async/await 是Promise的语法糖, await 后面接的是Promise的调用, await 拿到的是resolve的数据,也就是传给then的数据, reject的数据需要try...catc, catch的err是try中所有的await的错误
let q1 = async ()=>{ try { let res = await p1() console.log('await res=', res) } catch(err) { console.warn('awati rej=', err) } } 复制代码
async函数不带await执行,相当于同步函数
for(let i = 0; i<10; i++) { q1() } 复制代码
async函数带await执行,才是同步方式写异步
for(let i = 0; i<10; i++) { await q1() } 复制代码
后记: 其实,new Promise里放同步函数异步函数都可以,不过同步就没必要用Promise。 Node8 就提供了 util.promisify() 这个方法,方便我们快捷的把原来的异步回调方法改成返回 Promise 实例的方法,接下来,想继续用队列,还是 await 就看需要了。 只要符合 Node.js 的回调风格,所有函数都可以这样转换。 满足下面两个条件即可。