1. 程式人生 > 實用技巧 >promise鏈式呼叫的應用

promise鏈式呼叫的應用

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
    <script type="text/javascript">
    
    function cook() {
        console.log(
'開始做飯。'); var p = new Promise(function(resolve, reject){ setTimeout(function() { console.log('做飯完畢!'); resolve('雞蛋炒飯'); }, 1000); }); return p; } function eat(data) { console.log('開始吃飯:' + data);
var p = new Promise(function(resolve, reject) { setTimeout(function() { console.log('吃飯完畢!'); resolve('一塊碗和一雙筷子');// resolve()的值會傳遞給then中function的data引數,供下一個方法使用。 }, 2000); }); //這裡的return的作用是把第一個回撥函式的返回結果作為引數,傳遞給第二個回撥函式 return
p; } function wash(data) { console.log('開始洗碗:' + data); var p = new Promise(function(resolve, reject) { setTimeout(function() { console.log('洗碗完畢!'); resolve('乾淨的碗筷'); }, 2000); }); return p; } //補充程式碼 cook().then(resolve => { return eat(resolve) //第一個回撥函式完成以後,會將返回結果作為引數,傳入第二個回撥函式。所以這裡要用return返回函式去傳參。 }).then(resolve => { return wash(resolve); }).then(resolve => { //在Promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。 //then方法執行的是resolve這個回撥,並且這個函式都接受Promise物件傳出的值作為引數。而這裡“雞蛋炒飯”就是作為引數傳遞的 console.log(resolve); //resolve中的值是傳遞到then方法中的引數,只有在then中通過console.log輸出傳入的引數,才可以在控制檯檢視到訊息 }) //也可以像下面這樣寫,因為這三個函式本身設定的有return才可以這樣直接寫 //下一個then的回撥函式,會等上一個then中的回撥函式執行完畢,返回promise狀態,就執行. //首先eat,wash本身就是一個函式,所以可以直接作為then中的回到函式. //然後eat,wash函式內部也返回了promise,所以這樣寫沒有問題. cook() .then(eat) .then(wash); </script> </body> </html>

.then 中
1.return返回一個值,將返回的值作為下一個then中回撥函式的引數值
2.如果返回的是一個promise物件,將這個Promise 接受狀態的回撥函式中引數值作為下一個then回撥函式的引數值。

.then(fn(argument){})中的匿名函式實際上就是執行例項化Promise物件中的resolve(),當resolve(argument)中有引數時,可以將引數傳給.then()中的匿名函式

這裡原理都是一樣的,就是Promise例項生成以後,可以用then方法分別指定resolved狀態和rejected狀態的回撥函式。且都會返回一個Promise例項,所以可以鏈式呼叫then方法,上一個的返回值,可以作為下一個的引數。