promise執行順序總結

2021-10-11 02:27:17 字數 4106 閱讀 2582

1、	const promise = new promise((resolve, reject)=>)

promise.then(()=>)

console.log(5);

執行結果是: 1,2,5,4

解釋:promise的建構函式是同步執行,promise.then中的函式是非同步執行。

2、 const promise = new promise((resolve, reject) => )

promise

.then((res) => )

.catch((err) => )

執行結果:then: success1

解釋:建構函式中的 resolve 或 reject 只有第一次執行有效,多次呼叫沒有任何

作用。promise 狀態一旦改變則不能再變。

promise 有 3 種狀 態: pending、fulfilled 或 rejected。

狀態改變只能是 pending->fulfilled 或者 pending-> rejected,

狀態一旦改變則不能再變。

3、const promise = new promise((resolve, reject) => , 1000)

}) const start = date.now()

promise.then((res) => )

promise.then((res) => )

執行結果:once

success 1005

success 1007

解釋:promise 的 .then 或者 .catch 可以被呼叫多次,但這裡 promise 建構函式

只執行一次。或者說 promise 內部狀態一經改變,並且有了乙個值,那麼後續每

次呼叫 .then 或者 .catch 都會直接拿到該值。

4、console.log('start');

new promise(function(resolve,reject),2000);

}).then((value)=>,3000)

})

}).then((value)=>)

//輸出結果:

/* 立即輸出 start

兩秒輸出 hello

再三秒 world

*/

上面我們在 then() 函式中返回的是乙個新的promise,如果返回的不是乙個新的promise會怎樣呢?依然是上面的**,稍作修改。

console.log('start');

new promise(function(resolve,reject),2000);

}).then((value)=>,3000)

})

})();

return false;

}).then((value)=>)

/* 結果:

立即輸出 start

兩秒輸出 hello

三秒輸出 false

*/ 根據上面的執行結果來看,如果在乙個then()中沒有返回乙個新的promise,則

return 什麼下乙個then就接受什麼,在上面的例項**中return的是false,下乙個

then中接受到的value就是false,如果then中沒有return,則預設return的是 undefined.

then()中包含.then()的巢狀情況

then()的巢狀會先將內部的then()執行完畢再繼續執行外部的then();在多個then巢狀時建議將其展開,將then()放在同一級,這樣**更清晰。

console.log('start');

new promise((resolve,reject)=>,1000)

}).then((value)=>,1000)

}).then((value)=>)

.then((value)=>)

}).then((value)=>)

/* start

step

step1

step 1-1

step 1-2

110step 2*/

//展開之後的**

console.log('start');

new promise((resolve,reject)=>,1000)

}).then((value)=>,1000)

})}).then((value)=>)

.then((value)=>)

.then((value)=>)

catch和then的連用

如果每一步都有可能出現錯誤,那麼就可能出現catch後面接上then的情況。上**

new promise((resolve,reject)=>)

.then(value=>)

.catch(err=>)

.then(value=>)

.catch(err=>)

/* done 1

錯誤資訊1:error: done 1 error

done 2

說明catch後面會繼續執行then,catch返回的也是乙個promise例項

*/new promise((resolve,reject)=>)

.then(value=>)

.catch(err=>)

.then(value=>)

.catch(err=>)

/* done 1

錯誤資訊1:error: done 1 error

錯誤資訊2:error: catch error

如果在catch中也丟擲了錯誤,則後面的then的第乙個函式不會執行,因為返回的

promise狀態已經為rejected了

promise.all()

將多個promise批量執行,所有的promise都完畢之後返回乙個新的promise。

1、接收乙個陣列作為引數

2、陣列中可以是promise例項,也可以是別的值,只有promise會等待狀態的改變

3、所有子promise完成,則該promise完成,並且返回值是引數陣列中所有promise實

例的結果組成的陣列

4、有任何乙個promise失敗,則該promise失敗,返回值是第乙個失敗的promise的結果

console.log('here we go');

promise.all([1,2,3])

.then(all=>,'xxoo',false])

}).then(all=>,1500)

});let p2 = new promise(resolve=>,2000)

});return promise.all([p1,p2]);

}).then(all=>,1000)

})let p2 = new promise((resolve,reject)=>,3000)

})let p3 = new promise((resolve,reject)=>,2000)

})return promise.all([p1,p2,p3]);

}).then(all=>)

.catch(err=>)

/*here we go

1: 1,2,3

2: function(),xxoo,false

3: i'm p1,i'm p2

catch:p3

證明了上面的四點。

*/

promise.race()

和promise.all()差不多,區別就是傳入的陣列中有乙個promise完成了則整個promise完成了。

let p1 = new promise(resolve=>,10000);

}) let p2 = new promise(resolve=>,1000);

}) promise.race([p1,p2])

.then((value)=>)

/* p1 1s之後輸出

。。 等待十秒後**才算執行完畢

*/

ES6 Promise 並行執行和順序執行

1.promise.all 並行執行promise geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta new promise resolve,reject 1000 t...

ES6 Promise 並行執行和順序執行

geta和getb並行執行,然後輸出結果。如果有乙個錯誤,就丟擲錯誤 每乙個promise都必須返回resolve結果才正確 每乙個promise都不處理錯誤 const geta newpromise resolve,reject 1000 then result result const get...

Promise物件及它在js中的執行順序

學習阮一峰老師的es6入門後的記錄 1 promise的定義 promise是乙個物件,通常包裹著乙個非同步操作,promise物件提供一些介面的方法,返回一些操作的狀態或錯誤資訊 promise有三種狀態 pending 進行中 resolved 已完成,也叫fulfilled rejected ...