2017-09-26 123 views
0

這聽起來很奇怪,但我正在尋找一種多次解決承諾的方法。有沒有什麼辦法可以做到這一點?下面的示例中的如何多次解決承諾?

想:

getPromise() { 
    const event = new Event('myEvent'); 

    setTimeout(() => { 
    window.dispatchEvent(event); 
    }, 5000); 

    setTimeout(() => { 
    window.dispatchEvent(event); 
    }, 7000); 

    return new Promise((resolve) => { 
    window.addEventListener('myEvent',() => { 
     resolve('some value')); 
    }); 

    resolve('some value')); 
    }); 
}; 

然後。那麼():

getPromise().then(data => {console.log(data)}) 

應該給予以下結果:

some value // initial 
some value // after 5000ms 
some value // after 7000ms 

所以我知道有圖書館以流式傳輸數據,但我真的在尋找一種原生的非CallBak方法來實現這一點。

+2

承諾不能被解析多次。 –

回答

2

如何解決承諾多次?

你不行。承諾只能解決一次。一旦他們得到解決,他們永遠不會再改變他們的狀態。它們基本上是單向的狀態機,有三種可能的狀態待決,履行和拒絕。一旦他們從待處理完成或從待處理到拒絕,他們不能改變。

所以,你幾乎不能也不應該使用promise來做出你想多次發生的事情。事件監聽者或觀察者比這樣的承諾要好得多。您的承諾只會通知您有關收到的第一個活動。

我不知道你爲什麼要在這種情況下避免回調。承諾在他們的.then()處理程序中也使用回調。您需要回撥某處以使您的解決方案正常工作。你能解釋一下爲什麼你不直接使用window.addEventListener('myEvent', someCallback),因爲那樣會做你想要的嗎?


您可能會返回不止一次調用其通知回調的承諾類接口(它不遵循Promise標準)。爲了避免混亂的承諾,我不會用.then()作爲方法名:

function getNotifier() { 
 
    const event = new Event('myEvent'); 
 

 
    setTimeout(() => { 
 
    window.dispatchEvent(event); 
 
    }, 500); 
 

 
    setTimeout(() => { 
 
    window.dispatchEvent(event); 
 
    }, 700); 
 

 
    let callbackList = []; 
 
    const notifier = { 
 
     notify: function(fn) { 
 
      callbackList.push(fn); 
 
     } 
 
    }; 
 
    window.addEventListener('myEvent', (data) => { 
 
     // call all registered callbacks 
 
     for (let cb of callbackList) { 
 
      cb(data); 
 
     } 
 
    }); 
 
    return notifier; 
 
}; 
 

 
// Usage: 
 
getNotifier().notify(data => {console.log(data.type)})

+0

好的。這就是我的期望。我只是想確定是否有辦法實現它。也許是一種解決方法或什麼。我的圖書館的所有成員函數都會返回承諾,除此之外。所以我想把它做成相似的。但當然你的回答是正確的。所以謝謝你的努力! – Orlandster

+0

@Orlandster - 我在我的答案中增加了一個想法,它使得一個承諾類似但不是相同的界面能夠多次通知。 – jfriend00

+0

好的謝謝,太棒了! – Orlandster