什么时候处理异步事件?
上面代码有什么问题吗?
如何做呢?
回调地狱 - - !
//Promise参数是一个函数
//resolve,reject本身又是函数
new Promise((resolve,reject)=>{
//异步操作
setTimeout(()=>{
console.log('hello world');
setTimeout(()=>{
console.log('hello promise');
setTimeout(()=>{
console.log('hello vue');
},1000)
},1000)
},1000)
})
解决方法: 链式编程
//Promise参数是一个函数
//resolve,reject本身又是函数
new Promise((resolve,reject)=>{
//异步操作,第一次网络请求
setTimeout(()=>{
//第一次请求结果
console.log('hello world');
//再次请求
resolve()
},1000)
}).then(()=>{
//第二次网络请求
setTimeout(()=>{
//第二次请求结果
console.log('hello vue');
return new Promise((resolve,reject)=>{
//返回后再次请求
resolve()
})
},1000)
}).then(()=>{
//第三次网络请求
setTimeout(()=>{
//第三次请求结果
console.log('hello java');
},1000)
})
当执行new Promise() 是,会执行构造函数,保存一些状态信息,执行传入的函数
在执行传入的回调函数是,会传入两个参数,resolve,reject,本身又是函数
new Promise((resolve,reject)=>{
setTimeout(()=>{
//get data
resolve(data)
//失败的时候调用reject
reject('error message')
},1000)
}).then((data)=>{
//data处理代码
}).catch((err)=>{
//error处理代码
})
synchronization: 同步
asynchronization: 异步
new Promise((resolve,reject)=>{
setTimeout(()=>{
//resolve('hello,vuejs')
reject('err message')
},1000)
}).then(
(data) =>{
console.log(data);
},
(err) => {
console.log(err);
}
)
//wrapped into
//网络请求: aaa -> 自己处理
//处理: aaa111 -> 自己处理
//处理: aaa111222 -> 自己处理
new Promise((resolve,reject)=>{
//请求aaa
setTimeout(()=>{
//请求aaa处理aaa
resolve('aaa')
},1000)
}).then((res)=>{
console.log(res,'第一层的10行处理代码');
//继续请求
return new Promise(((resolve)=>{
resolve(res + '111')
}))
}).then(res=>{
console.log(res,'第二层的10行处理代码');
return new Promise((resolve)=>{
resolve(res+'222')
})
}).then(res=>{
console.log(res,'第三层的10行处理代码');
})
下面可以简写
return new Promise((resolve)=>{
resolve(res+'222')
})
new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('aaa')
},1000)
}).then(res=>{
console.log(res);
console.log('第一层的10行处理代码');
return Promise.resolve(res+'111');
}).then(res=>{
console.log(res);
console.log('第二层的10行处理代码');
return Promise.resolve(res+'222')
}).then(res=>{
console.log(res);
console.log('第三层的10行处理代码');
})
还可以再简化
当然reject也有简写
throw ‘发生错误了’
也可以catch出来