一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
背景
实际开发中,想让程序按顺序执行:
错误的做法:单纯的先后调用多个异步函数。如:
login();
userInfo();
getData();
原因:
因为函数几乎同步执行,各自执行各自的,互相之间不会等待。 有一种方式可以解决,回调函数。
function login(parameter){
setTimeout(function(){
parameter()
},1000)
}
login(
function(){
userInfo(
function(){
getData()
}
)
}
)
问题:
执行的先后执行的任务多了,就会形成很深的嵌套结构,造成回调地域,极其不优雅,极其不便于维护。
任务1(
function(){
任务2(
function(){
任务3(
function(){
任务4(
function(){
任务5
}
)
}
)
}
)
}
)
好的解决方法:Promise
什么是Promise
想让多个异步任务必须按顺序执行时,又可以解决回调函数的回调地域问题的一种es6异步语法糖。
怎么用?
fucntion 前一项任务(){
return new Promise(
function(下一项任务的open开关){
原异步任务
异步任务最后一句话
调用开关open()//通向.then(),自动执行.then中的下一个任务
}
)
}
问题 :默认每个 new Promise默认不相连
2) 连接前后连个promise异步任务:前一项任务().then(后一项任务)
强调:之后的任务一定不要加(),加()表示立即执行,而我们不希望后边的任务立即执行,后续任务必须等待前一项任务执行完,才能执行。
login().then(userInfo).then(getData)
问题:为什么会有要求下一个异步任务必须在前一项异步任务之后才能执行?
往往因为下一项异步任务必须获得前一项异步任务的执行结果,才能继续执行后续操作。
比如就是我上面举的栗子,先登录拿到登录凭证token,才能请求此用户的权限,拿到权限,再请求数据。
所以: 前一项任务应该向下一项任务传值。
Promise的详细使用参考菜鸟教程: www.runoob.com/w3cnote/jav…