fetch是个典型的Promise,在当前页打开chrom控制台,输入下面的代码查看输出结果promise
fetch('/').then(res=>res.text()).then(data=>console.log(data.length))
复制代码
setTimeout是典型的异步函数,使用一个回调函数做为参数 这里会返回一个正整数,表示定时器的编号bash
setTimeout(
function () {
console.log('123')
},
1000
)
复制代码
用Math.random生成rnd 若是rnd大于0.5则resolve(rnd),不然reject(rnd) 一个new Promise是一个立执行的函数,要有then和catchdom
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的错误async
let q1 = async ()=>{
try {
let res = await p1()
console.log('await res=', res)
}
catch(err) {
console.warn('awati rej=', err)
}
}
复制代码
async函数不带await执行,至关于同步函数ide
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 的回调风格,全部函数均可以这样转换。 知足下面两个条件便可。测试