Promise如何解決回調地獄


為什么要有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)
    })

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM