為什么要有promise:解決(回調地獄)的問題
### 回調地獄:
```js //跟以前的if條件地獄很像
// if(){ // if(){ // if(){ // } // } //}
$.get("/getUser",function(res){
$.get("/getUserDetail",function(){
$.get("/getCart",function(){
$.get("/getBooks",function(){ //...
})
})
})
})
//node開發:讀取文件;開個服務器、接收一個請求、請求路徑、訪問數據庫 ```
### Promise函數基本用法
```js
var promise=new Promise((resolve,reject)=>{
//b 把需要執行的異步操作放在這里
$.get("/getUser",res=>{
//獲取數據的異步操作已經執行完畢了,等待下一步的執行,通過執行resolve函數,告訴外界你可以執行下一步操作了
//c、
resolve(res) //只是一個標記
//而執行的下一步操作,其實就是寫在then的回調函數中的
})
})
//a、
promise.then(res=>{
//d、執行后續的操作
console.log(res);
})
```
//把異步操作封裝在一個promise對象中 function fn(){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ console.log('你好'); //其實異步邏輯到這里其實已經執行完畢了, //就可以告訴外界,可以執行其他操作了 //如何告訴外界,讓外界得知? resolve(); },1000); }) } //調用了這個函數,執行了異步操作 //fn() //存在問題,並不知道這個異步操作什么時候結束 fn().then(res=>{ //執行到下一步 console.log("下一步"); fn().then(res=>{ console.log("執行第二步"); }) }) //輸出順序: //你好 //下一步 //你好 //執行第二步
function f1(){ return new Promise(resolve=>{ setTimeout(()=>{ console.log('第一步'); //異步邏輯已經執行完,必須要告訴外界我執行完了 resolve(); },1000) }) } function f2(){ return new Promise(resolve=>{ setTimeout(()=>{ console.log('第二步'); //告訴外界我執行完了 resolve(); },1000) }) } f1().then(res=>{ //返回一個promise對象,然后鏈式調用then方法 return f2(); }).then(res=>{ return f1(); }).then(res=>{ return f2(); }).then(res=>{ setTimeout(()=>{ console.log('完成'); },1000) })