听起来可能很奇怪,但是我正在寻找一种可以多次解决承诺的方法。有什么方法可以做到这一点?
考虑以下示例:
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'));
});
};
然后.then():
getPromise().then(data => {console.log(data)})
应给出以下结果:
some value // initial
some value // after 5000ms
some value // after 7000ms
因此,我知道有一些库可以流数据,但是我确实在寻找一种本机的非Callbak方法来实现这一目标。
如何多次兑现承诺?
你不能 承诺只能解决一次。一旦解决,他们再也不会改变状态。它们本质上是单向状态机,具有三个挂起,实现和拒绝的可能状态。一旦它们从待定变为已实现,或者从待定变为拒绝,就无法更改。
因此,您几乎不能也不应将诺言用于您想多次发生的事情。事件监听器或观察者比类似的承诺要好得多。您的承诺只会通知您有关它收到的第一个事件的信息。
我不知道您为什么要在这种情况下避免回调。承诺也在其.then()
处理程序中使用回调。您将需要在某处进行回调以使解决方案正常工作。您能解释一下为什么不直接使用window.addEventListener('myEvent', someCallback)
它的原因吗?
您可以返回类似promise的接口(不遵循Promise标准),该接口会多次调用其通知回调。为了避免与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)})
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句