/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ 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(); } } } }