这可能听起来很奇怪,但我正在寻找一种方法来多次解决承诺。有没有办法让这成为可能?
想想以下示例:
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方法来实现这一目标。
答案 0 :(得分:7)
如何多次解决承诺?
你做不到。承诺只能解决一次。一旦他们得到解决,他们再也不会改变他们的状态了。它们本质上是单向状态机,具有待处理,已满足和拒绝的三种可能状态。一旦他们从待决到履行或从待决到被拒绝,他们就无法改变。
所以,你几乎不能也不应该将promises用于你想多次出现的事情。事件监听器或观察者比这样的事情的承诺要好得多。您的承诺只会通知您收到的第一个事件。
我不知道你为什么要在这种情况下避免回调。 Promise在window.addEventListener('myEvent', someCallback)
处理程序中也使用回调。您需要在某处进行回调才能使解决方案正常运行。你能解释为什么你不直接使用.then()
,因为那会做你想要的吗?
您可以返回一个类似承诺的界面(不遵循Promise标准),它会多次调用其通知回调。为避免与promises混淆,我不会使用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)})
作为方法名称:
Console~/
Console
R Markdown
.../R Test 1/Fall Programming with R Test 1.Rmd
Error in loadNamespace(i, c(lib.loc, .libPaths()), versionCheck = vI[[i]]) :
there is no package called 'backports'
Calls: :: ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted
答案 1 :(得分:0)
我在Typescript中有解决方案。
ani.event_source.start()