js執行順序/Promise優雅解決回呼函數嵌套

來源:互聯網
上載者:User

標籤:bsp   events   封裝   tostring   class   files   意思   ring   解決   

先執行同步

然後把settimeout(function xx(){}放進堆棧

然後執行回調 function xx()

 

/** * Created by Administrator on 2016/10/28. */// nodejs 封裝操作檔案的功能 fsvar fs = require(‘fs‘);//同步讀取// var str = ‘‘// str += fs.readFileSync(‘./data/01‘,‘utf-8‘);// str += fs.readFileSync(‘./data/02‘,‘utf-8‘);// str += fs.readFileSync(‘./data/03‘,‘utf-8‘);// str += fs.readFileSync(‘./data/04‘,‘utf-8‘);//// console.log(str);//非同步讀取代碼/** * 需求:第一個檔案讀取完成以後 緊接著用第一個拿到的資料 */// fs.readFile(‘./data/01‘,‘utf-8‘,function(err,data1){//     if(err){//         console.log("檔案讀取錯誤");//     }else{//         fs.readFile(‘./data/02‘,‘utf-8‘,function(err,data2){//             if(err){//                 console.log("檔案讀取錯誤");////             }else{//                 fs.readFile(‘./data/03‘,‘utf-8‘,function(err,data3){//                     if(err){//                         console.log("檔案讀取錯誤");//                     }else{//                         fs.readFile(‘./data/04‘,‘utf-8‘,function(err,data4){//                             if(err){//                                 console.log("檔案讀取錯誤");//                             }else{//                                 console.log(data1+data2+data3+data4);//                             }//                         });//                     }//                 });//             }//         });//     }// });/** * 回呼函數嵌套問題 * Promise(承諾的意思) 這個對象用來執行回調的代碼 會儲存狀態 進行中(pendding) * 已經完成Resolved   已經失敗 reject   把非同步代碼丟給Promise對象執行 *  Promise.then  然後的意思  根據這個狀態 去調用的函數 */function fn1(){    var p = new Promise(function(resovle,reject){          //進行中--》完成          //進行中--> 失敗           fs.readFile(‘./data/01‘,‘utf-8‘,function(err,data){                console.log("代碼正在執行1");               resovle(data);           })    });    return p;}function fn2(){    var p = new Promise(function(resovle,reject){        //進行中--》完成        //進行中--> 失敗        fs.readFile(‘./data/02‘,‘utf-8‘,function(err,data){            console.log("代碼正在執行2");            resovle(data);  //已經完成存了狀態        })    });    return p;}function fn3(){    var p = new Promise(function(resovle,reject){        //進行中--》完成        //進行中--> 失敗        fs.readFile(‘./data/03‘,‘utf-8‘,function(err,data){            console.log("代碼正在執行3");            resovle(data);  //已經完成存了狀態        })    });    return p;}//然後  根據狀態 來做接下來的事情  相當於把非同步代碼寫成同步// fn1().then(function (data) {//     console.log(data.toString());//     return fn2();// }).then(function(data2){//     console.log(data2.toString());//     return fn3();// }).then(function(data3){//     console.log(data3.toString());// });///** * 總結:1 Promise是一個內建的對象 前後端都可以使用 * 2  作用: 優雅的解決回呼函數嵌套 * 3  如何使用 *     1)把每一步的回調代碼抽離出來 *     2)在調用的時候 挨個去調用  借用promise的特性來實現 *     es5(寫回調相當痛苦)  在es6 裡面被定為標準 */function fn1() {    var p =new Promise(function (resolve,reject) {        //在這裡把原來的回調代碼放在這裡執行        /**         * 三種狀態: 進行中-->  已經完成  ---> 已經失敗         */            fs.readFile(‘./data/01‘,‘utf-8‘,function (err,data) {                    if(err){                        reject(err);                    }else {                        resolve(data);                    }            })    });    return p;}fn1().then(function (data) {    console.log(data);    return fn2();},function (err) {    console.log(err);})Promise.all([fn1(),fn2(),fn3()]).then(function (result) {    console.log(result);})

 

/** * nodejs學習的特點: 學習對應模組的操作 *//** *  1 事件模組  events *      a  引入模組 *      b  監聽事件 on *      c  觸發事件(人為觸發emit或者伺服器的某些行為觸發 data  ) */ var events = require("events");//eventEmitter 記錄一些事件的基本資料var eventEmitter = new events.EventEmitter();//使用這個對象eventEmitter.on(‘xx‘,function(){    console.log(‘xxd‘);});//觸發事件eventEmitter.emit(‘xx‘);/** Promise   new  出來** //解決回調嵌套的方法:* 1 把原來層層嵌套的這些非同步代碼  抽出來包成函數 * 2 把抽出來的非同步代碼 放到  promise裡面  promise裡面接收一個函數作為參數 * 3 通過 then這個方法來訪問 * react 面向未來   vuejs  虛擬dom * 以上步驟: 把原來嵌套(可讀性相當低)的代碼 寫來可讀性更高一些 * * http 網站服務 * fs   檔案模組 * events  事件模組* */

 

js執行順序/Promise優雅解決回呼函數嵌套

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.