Orl*_*ter 1 javascript events promise ecmascript-6
这可能听起来很奇怪,但我正在寻找一种方法来多次解决一个承诺.有没有办法让这成为可能?
想想以下示例:
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'));
});
};
Run Code Online (Sandbox Code Playgroud)
然后.then():
getPromise().then(data => {console.log(data)})
Run Code Online (Sandbox Code Playgroud)
应该给出以下结果:
some value // initial
some value // after 5000ms
some value // after 7000ms
Run Code Online (Sandbox Code Playgroud)
所以我知道有流库存数据库,但我真的在寻找一种原生的非callbak方法来实现这一目标.
如何多次解决承诺?
你不能.承诺只能解决一次.一旦他们得到解决,他们再也不会改变他们的状态了.它们本质上是单向状态机,具有待处理,已满足和拒绝的三种可能状态.一旦他们从待决到履行或从待决到被拒绝,他们就无法改变.
所以,你几乎不能也不应该为你想要多次发生的事情使用promises.事件监听器或观察者比这样的事情的承诺要好得多.您的承诺只会通知您收到的第一个事件.
我不知道你为什么要在这种情况下避免回调.Promise在.then()处理程序中也使用回调.您需要在某处进行回调才能使解决方案正常运行.你能解释为什么你不直接使用window.addEventListener('myEvent', someCallback),因为那会做你想要的吗?
您可以返回一个类似承诺的接口(不遵循Promise标准),它会多次调用其通知回调.为避免与promises混淆,我不会将其.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)})Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4225 次 |
| 最近记录: |