[IMP] web: concurrency utils: add Deferred

Part-of: odoo/odoo#92475
This commit is contained in:
Aaron Bohy
2022-06-30 09:29:41 +02:00
parent 313052ffb8
commit 7a8052efd8
3 changed files with 33 additions and 11 deletions
@@ -154,3 +154,18 @@ export class Race {
return this.currentProm;
}
}
/**
* Deferred is basically a resolvable/rejectable extension of Promise.
*/
export class Deferred {
constructor() {
let resolve;
let reject;
const prom = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return Object.assign(prom, { resolve, reject });
}
}
@@ -1,6 +1,6 @@
/** @odoo-module **/
import { Mutex, KeepLast, Race } from "@web/core/utils/concurrency";
import { Deferred, Mutex, KeepLast, Race } from "@web/core/utils/concurrency";
import { nextTick, makeDeferred } from "../../helpers/utils";
QUnit.module("utils", () => {
@@ -312,4 +312,18 @@ QUnit.module("utils", () => {
assert.verifySteps(["ok (44)"]);
assert.strictEqual(race.getCurrentProm(), null);
});
QUnit.test("Deferred: basic use", async function (assert) {
const def1 = new Deferred();
def1.then((v) => assert.step(`ok (${v})`));
def1.resolve(44);
await nextTick();
assert.verifySteps(["ok (44)"]);
const def2 = new Deferred();
def2.catch((v) => assert.step(`ko (${v})`));
def2.reject(44);
await nextTick();
assert.verifySteps(["ko (44)"]);
});
});
+3 -10
View File
@@ -2,9 +2,10 @@
import { browser } from "@web/core/browser/browser";
import { isMacOS } from "@web/core/browser/feature_detection";
import { download } from "@web/core/network/download";
import { Deferred } from "@web/core/utils/concurrency";
import { patch, unpatch } from "@web/core/utils/patch";
import { registerCleanup } from "./cleanup";
import { download } from "@web/core/network/download";
const { App, onMounted, onPatched, useComponent } = owl;
@@ -150,15 +151,7 @@ export async function nextTick() {
}
export function makeDeferred() {
/** @type {(value:any)=>void} */
let resolve;
/** @type {(reason?:any)=>void} */
let reject;
const prom = new Promise((res, rej) => {
resolve = res;
reject = rej;
});
return Object.assign(prom, { resolve, reject });
return new Deferred();
}
function findElement(el, selector) {