function asyncMessage(msg) { let deferred const onMessage = function (msg) { if (deferred) { deferred.resolve(msg) deferred = null } } const nextMessage = function () { if (!deferred) { deferred = {} deferred.promise = new Promise(resolve => deferred.resolve = resolve) } return deferred.promise } setTimeout(() => onMessage(msg), 3000) return nextFrame }