32 lines
806 B
JavaScript
32 lines
806 B
JavaScript
|
import Helper from '@ember/component/helper';
|
||
|
import { Promise } from 'rsvp';
|
||
|
|
||
|
export default class AwaitHelper extends Helper {
|
||
|
compute([promise]) {
|
||
|
if (!promise || typeof promise.then !== 'function') {
|
||
|
return promise;
|
||
|
}
|
||
|
if (promise !== this.lastPromise) {
|
||
|
this.lastPromise = promise;
|
||
|
this.value = null;
|
||
|
this.resolve(promise);
|
||
|
}
|
||
|
return this.value;
|
||
|
}
|
||
|
async resolve(promise) {
|
||
|
let value;
|
||
|
try {
|
||
|
value = await Promise.resolve(promise);
|
||
|
} catch (error) {
|
||
|
value = error;
|
||
|
} finally {
|
||
|
// ensure this promise is still the newest promise
|
||
|
// otherwise avoid firing recompute since a newer promise is in flight
|
||
|
if (promise === this.lastPromise) {
|
||
|
this.value = value;
|
||
|
this.recompute();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|