function log(){
console.log('log')
}
log()
console.log('end')
//伪代码
(function(){
function log(){
console.log('log')
}
log()
})()
function log(){
setTimeout(function(){
console.log('log')
},1000)
}
log()
console.log('end')
//伪代码
(function(){
function log(){
let timer1 = setTimeout(function(){
console.log('log')
},1000)
}
log()
})()
有调用者定义,交给执行者的函数。将函数作为参数传递
function foo(callback){
setTimeout(function(){
callback()
},1000)
}
foo(function(){
console.log('异步回调')
})
CommonJs 为异步编程提供统一、更合理、更强大的解决方案
graph LR
Promise-->承诺
承诺-->失败
承诺-->成功
失败-->onFulfilled
成功-->onRejected
Promise里面就算是同步的也是放在队列中执行回调,所以end 会先打印
const promise = new Promise((resolve,reject)=>{
resolve(100) //承诺达成
// reject(nesw Error('promise rejected')) //承诺失败
})
promise.then(val=>{
console.log(val)
},error=>{
console.log(error)
})
console.log('end')
使用了webpack-dev-server 执行
function ajax(url){
return new Promise((resolve,reject)=>{
var xhr = new XMLHttpRequest()
xhr.open('GET',url)
xhr.responseType = 'json'
xhr.onload=function(){
if(this.status === 200){
resolve(this.response)
}else{
reject(new Error(this.statusText))
}
}
xhr.send()
})
}
ajax('/api/test.json')
.then(res=>{
console.log(res)
},err=>{
console.log(err)
})
ajax('/api/test2.json')
.then(res=>{
console.log(res)
},err=>{
console.log(err)
})
如果在then方法里面继续调用Promise就会陷入回调地狱,这样是错误的
ajax('/api/test.json')
.then(res => {
ajax('/api/list.json')
.then(res => {
ajax('/api/list2.json')
.then(res => {
})
})
})
ajax('/api/test.json')
.then(res => {
console.log(res)
return ajax('/api/list.json')
})
.then(res => {
console.log(res)
return ajax('/api/list2.json')
})
.then(res => {
console.log(res)
})
ajax('/api/test.json')
.then(res => {
console.log(res)
return ajax('/api/list.json')
})
.then(res => {
console.log(res)
return ajax('/api/list2.json')
})
.then(res => {
console.log(res)
})
.catch(err=>{
cosno.log(err)
})
Promise.resolve('foo')
.then(res=>{
console.log(res)//foo
})
Promise.reject(new Error('err'))
.catch(err=>{
console.log(err)
})
const p1 = ajax('/api/test.json')
const p2 = ajax('/api/list.json')
const p3 = ajax('/api/list2.json')
// const p4 = ajax('/api/err.json')
Promise.all([p1,p2,p3])
.then(res=>{
console.log(res)
})
.catch(err=>{
console.log(err)
})
实现ajax请求超时控制方式
const p1 = ajax('/api/test.json')
const timer = new Promise((resolve,resolve)=>{
setTimeout(()=>reject(new Error('timeout')),500)
})
Promise.race([p1,timer])
.then(res=>{
console.log(res)
})
.catch(err=>{
console.log(err)
})
console.log('start')
setTimeout(()=>console.log('setTimeout'),0)
Promise.resolve()
.then(res=>{
console.log('Promise')
})
.then(res=>{
console.log('Promise')
})
.then(res=>{
console.log('Promise')
})
console.log('end')
// 定义主函数
function * main (){
const data = yield ajax('/api/test.json')
const list = yield ajax('/api/list.json')
const list2 = yield ajax('/api/list2.json')
console.log(data,list,list2)
// {data: Array(2)} {data: "list"} {data: "list"}
}
const g = main()
const result = g.next()
result.value.then(res=>{
const res2 = g.next(res)
res2.value.then(res=>{
const res3 = g.next(res)
g.next(res)
})
})
优化上面代码
function* main() {
try {
// 同步调用
const data = yield ajax('/api/test.json')
const list = yield ajax('/api/list.json')
const list2 = yield ajax('/api/list2.json')
console.log(data, list, list2)
// {data: Array(2)} {data: "list"} {data: "list"}
} catch (error) {
// 捕获异常处理
console.log(error)
}
}
const g = main()
// 生成器函数执行器
function handleResult(result) {
if (result.done) return //生成器函数结束
result.value.then(data => {
// 进行到下一个生成器
handleResult(g.next(data))
},err=>{
// 捕获异常 传递
g.throw(err)
})
}
handleResult(g.next())
封装co 生成器函数执行器
function* main() {
try {
// 同步调用
const data = yield ajax('/api/test.json')
const list = yield ajax('/api/list.json')
const list2 = yield ajax('/api/list2.json')
console.log(data, list, list2)
// {data: Array(2)} {data: "list"} {data: "list"}
} catch (error) {
// 捕获异常处理
console.log(error)
}
}
function co(generator) {
const g = generator()
// 生成器函数执行器
function handleResult(result) {
if (result.done) return //生成器函数结束
result.value.then(data => {
// 进行到下一个生成器
handleResult(g.next(data))
}, err => {
// 捕获异常 传递
g.throw(err)
})
}
handleResult(g.next())
}
co(main)
async function main() {
try {
// 同步调用
const data = await ajax('/api/test.json')
const list = await ajax('/api/list.json')
const list2 = await ajax('/api/list7.json')
console.log(data, list, list2)
// {data: Array(2)} {data: "list"} {data: "list"}
return [data, list, list2] //返回值可以直接传到 then 方法
} catch (error) {
// 捕获异常处理
console.log(error)
throw error // 继续触发 错误可以在外部的catch 捕获
}
}
const promise = main()
promise.then(res=>{
console.log(res) // (3) [{…}, {…}, {…}]
})
.catch(err=>{
console.log(err)
})