javascript - Kako pretvoriti trigger/event u Promise ili async/await?
Pokušavam pretvoriti callback funkciju u async/await. Kod koristi postMessage iz glavnog prozorskog okvira prema iframeu. Kada iframe pošalje poruku natrag, poziva callback funkciju. Postoji li neki način da se pretvori u Promise iz $ (window).on(...) obrasca?
Minimalna verzija funkcionalnog koda:
Za pozivanje funkcije:
window.bridge.post(cb);
Objekt mosta:
class Bridge {
constructor(win, root) {
this.win = win;
this.root = root;
this.bindEvents();
this.post = this.factoryMethod('post', 'postResult');
}
post(eventName, paramObject) {
this.win.postMessage([eventName, JSON.stringify(paramObject)], this.root);
}
bindEvents() {
window.addEventListener('message', e => this.handleEvents(e));
}
handleEvents(e) {
const eventName = e.data[0];
const eventObj = e.data[1];
if (typeof eventName !== 'undefined' && eventName != null) {
$(window).trigger(eventName, eventObj);
}
}
factoryMethod(msgIn, msgOut) {
return (cb) => {
this.post(msgIn, {});
$(window).on(msgOut, (e, arg) => cb(arg));
};
}
}
export default Bridge;
Unaprijed hvala.
Odgovor #1
Zahvaljujući Bergijevom komentaru, mogu ga pretvoriti u Promise.
factoryMethod(msgIn, msgOut) {
return (ann) => new Promise((resolve, reject) => {
this.post(msgIn, ann);
$(window).on(msgOut, (e, arg) => resolve(arg));
});
}
Ovo vraća funkciju višeg reda koja vraća obećanje (Promise).
Odgovor #2
Možda je već odgovoreno, ali ovo je kako to obično radim:
// given you've defined this `Future` fn somewhere:
const Future = fn => {return new Promise((r,t) => fn(r,t))}
// define an eventFn that takes a promise `resolver`
const eventFn = resolve => {
// do event related closure actions here. When finally done, call `resolve()`
something.oneventfired = e => {resolve(e)}
}
// invoke eventFn in an `async` workflowFn using `Future`
// to obtain a `promise` wrapper
const workflowFn = async () => {await Future(eventFn)}
Posebno za stvari poput
indexedDbomotnika događaja kako bi se pojednostavila upotreba.
Ili biste mogli smatrati ovu varijaciju Future prikladnijom za opću upotrebu
class PromiseEx extends Promise {
resolve(v,...a) {
this.settled = true; this.settledValue = v;
return(this.resolve_(v,...a))
}
reject(v,...a) {
this.settled = false; this.settledValue = v;
return(this.reject_(v,...a))
}
static Future(fn,...args) {
let r,t,ft = new PromiseEx((r_,t_) => {r=r_;t=t_})
ft.resolve_ = r; ft.reject_ = t; fn(ft,...args);
return(ft)
}
}
