1. 程式人生 > 實用技巧 >es6中Promise多個then的使用方法

es6中Promise多個then的使用方法

應用場景:

我們有一個A方法ajax方法獲得使用者資訊,我們還有一個B方法是馬上要使用使用者資訊,當兩個方法同時呼叫時候,我們無法判別B方法已經拿到A方法的ajax獲取的使用者資訊,基於這樣的需求,我們急需一個能讓他們按照A->B的順序同步執行的東西。

解決辦法:

es6的Promise物件是可以實現同步操作的,這解決了ajax請求想同步按照順序執行的問題。

在後面每個then的時候,我們需要返回Promise物件才可以一直then呼叫,我們可以直接

return new Promise(response => {
   response({ name: "第2個傳的值" })
});

也可以使用Promise提供的方法

 return Promise.resolve({ name: "第3個傳的值" });

使用return new Promise方式無限呼叫then:

new Promise((resolve, reject) => {
    console.log(1)
    resolve({
        name: "第1個傳遞的值"
    });
}).then((result) => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            console.log(
2, result) resolve({ name: "第2個傳遞的值" }) }, 1000) }) }).then((result) => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(3, result) resolve({ name: "第3個傳遞的值" }) },
1000) }) }).then((result) => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(4, result) resolve({ name: "第4個傳遞的值" }) }, 1000) }) }).then((result) => { return new Promise((resolve, reject) => { setTimeout(() => { console.log(5, result) }, 1000) }) })

除了上面的方式,還可以使用promise.all方法來實現:

var p1 = new Promise((resolve, reject) => {
      console.log(1)
      resolve()
    })
    var p2 = new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(2)
        resolve()
      }, 1000);
    })
    var p3 = new Promise((resolve, reject) => {
      setTimeout(() => {
        console.log(3)
        resolve()
      }, 1000);
    })
 
    Promise.all([p1, p2, p3]).then((result) => {
      console.log("執行完畢");
    })

  1. var p1 = new Promise((resolve, reject) => {
  2. console.log(1)
  3. resolve()
  4. })
  5. var p2 = new Promise((resolve, reject) => {
  6. setTimeout(() => {
  7. console.log(2)
  8. resolve()
  9. }, 1000);
  10. })
  11. var p3 = new Promise((resolve, reject) => {
  12. setTimeout(() => {
  13. console.log(3)
  14. resolve()
  15. }, 1000);
  16. })
  17. Promise.all([p1, p2, p3]).then((result) => {
  18. console.log("執行完畢");
  19. })