回調地獄問題

舉一個文件操做的例子,先建立3個txt文件, a.txt,b.txt.c.txt  內容分別爲  aaaa,bbbbb,cccc`api

var fs = require('fs')

//文件操做是異步的   執行順序不必定是按順序執行
fs.readFile('./data/a.txt','utf8',function(err,data){
    if(err){
        //return console.log('讀取失敗')
        //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
        throw err;
    }
    console.log(data)
})

fs.readFile('./data/b.txt','utf8',function(err,data){
    if(err){
        //return console.log('讀取失敗')
        //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
        throw err;
    }
    console.log(data)
})

fs.readFile('./data/c.txt','utf8',function(err,data){
    if(err){
        //return console.log('讀取失敗')
        //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
        throw err;
    }
    console.log(data)
})

有時咱們可能想要程序按照順序執行異步

var fs = require('fs')

//在a回調函數種執行b,b的回調函數種執行c 這樣就造成了多層嵌套,稱爲回調地獄
fs.readFile('./data/a.txt','utf8',function(err,data){
    if(err){
        //return console.log('讀取失敗')
        //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
        throw err;
    }
    console.log(data)
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            //return console.log('讀取失敗')
            //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
            throw err;
        }
        console.log(data)
        fs.readFile('./data/c.txt','utf8',function(err,data){
            if(err){
                //return console.log('讀取失敗')
                //拋出異常,阻止程序繼續執行,把錯誤打印到控制檯
                throw err;
            }
            console.log(data)
        })
    })
})

隨之EcrameScript種出現了Promise這個api來解決這種回調嵌套的問題函數

下面是一個Promise的一個簡單案例ui

//Promise是一個構造函數
var fs = require('fs')

/**
 * Promise容器中存放異步任務,有三個狀態,
 * Pending(正在進行),
 * Resolved(成功)
 * Rejected(失敗)
 * 執行結束只會有兩種結果
 * Pending-->Resolved
 * Pending-->Rejected
 */

//建立Promise容器 一旦建立就會執行裏面的代碼
var p1 = new Promise(function(resolve,reject) {
    fs.readFile('./data/a.txt','utf8',function(err,data){
        if(err){
            reject('失敗')
        }else{
            resolve(data) 
        }
    })
})

var p2 = new Promise(function(resolve,reject) {
    fs.readFile('./data/b.txt','utf8',function(err,data){
        if(err){
            reject('失敗')
        }else{
            resolve(data) 
        }
    })
})

var p3 = new Promise(function(resolve,reject) {
    fs.readFile('./data/c.txt','utf8',function(err,data){
        if(err){
            reject('失敗')
        }else{
            resolve(data) 
        }
    })
})

/*
    當p1執行成功的時候 當前函數種return的結果就能夠在then的funtion中獲得,
    也就是能夠在then中的回調函數中獲得
    return 123獲得的就是123  沒有return獲得的就是undefined
    真正使用的話,咱們是能夠return一個Promise對象
    return 一個Promise對象時,後續的then中的第一個參數就是返回的Promise對象的resolve參數
*/
p1.then(function(data){
    console.log(data);
    return p2
},function(err){
    console.log(err);
})
.then(function(data){
    console.log(data);
    return p3
})
.then(function(data){
    console.log(data);
})
相關文章
相關標籤/搜索