JS備忘

石曼迪發表於2017-04-12

1. Promise用法

js非同步呼叫較多,如果某個操作是基於上個非同步結果才能執行的,再有一個操作又是基於此操作的,則需要巢狀多層程式碼,在ES6中引入了Promise寫法,可以比較優雅的解決這個問題:

    <script type="text/javascript">
        function runAsync1(para) {
            var p = new Promise(function (resolve, reject) {
                //做一些非同步操作
                setTimeout(function () {
                    console.log('非同步任務1執行完成');
                    resolve(para + 1);
                }, 1000);
            });
            return p;
        }
        function runAsync2(para) {
            var p = new Promise(function (resolve, reject) {
                //做一些非同步操作
                setTimeout(function () {
                    console.log('非同步任務2執行完成');
                    resolve(para + 2);
                }, 2000);
            });
            return p;
        }
        function runAsync3(para) {
            var p = new Promise(function (resolve, reject) {
                //做一些非同步操作
                setTimeout(function () {
                    console.log('非同步任務3執行完成');
                    resolve(para + 3);
                }, 2000);
            });
            return p;
        }

        runAsync1(1)
        .then(function (data1) {
            console.log(data1);
            return runAsync2(data1);
        })
        .then(function (data2) {
            console.log(data2);
            return runAsync3(data2);
        })
        .then(function (data3) {
            console.log(data3);
        });

    </script>

 輸出的結果是:

非同步任務1執行完成
2
非同步任務2執行完成
4
非同步任務3執行完成
7

 只需要看最後幾行就可以,第一個then接收runAsync1的返回值data1可以將其傳遞給第二個操作,第二個then接收runAsync2的返回值data2將其當做引數傳遞給第三個操作。