Javascript 正在等待redux状态满足条件

Javascript 正在等待redux状态满足条件,javascript,asynchronous,redux,promise,race-condition,Javascript,Asynchronous,Redux,Promise,Race Condition,我有以下函数,它允许我在redux状态下等待特定条件的获得 async function when(store, condition) { if (condition(store.getState())) { return; } else { return new Promise(resolve => { const unsubscribe = store.subscribe(() => {

我有以下函数,它允许我在redux状态下等待特定条件的获得

async function when(store, condition) {
    if (condition(store.getState())) {
        return;
    } else {
        return new Promise(resolve => {
            const unsubscribe = store.subscribe(() => {
                if (condition(store.getState())) {
                    unsubscribe();
                    resolve();
                }
            });
        });
    }
}
然而,我正在努力弄清楚这是否是免费的比赛条件。特别是,如果我有一个函数,如…:

async function foo(store) {
    await when(store, thereAreExactlyThreeTodoItems);

    doSomethingThatRequiresExactlyThreeTodoItems();
}
…当调用
dosomethingtherequirectlythreetodoitems()
时,我是否可以保证由
thereartlythreetodoitems()表示的条件为
true
?或者这是否需要进一步的措施来保证?i、 e:

async function foo(store) {
    do {
        await when(store, thereAreExactlyThreeTodoItems);
    } while (!thereAreExactlyThreeTodoItems(store.getState());

    doSomethingThatRequiresExactlyThreeTodoItems();
}
我所担心的是:在调用
resolve()
之后,但在将控制权返回到
foo()
之前,是否可以调度一个使条件无效的操作?不幸的是,我没有足够好的javascript事件循环的心智模型来确定


非常感谢您的帮助。

您正在尝试做的事情看起来不错,唯一奇怪的是您没有缓存承诺创建

我认为您必须创建一个映射并缓存已创建的承诺,这样您就不会为相同的函数创建新的承诺

在这种情况下,我看不到一种方式,你可以有种族条件的问题

大致如下:

const cache = {}

function when(store, condition, id) {
    if (condition(store.getState())) {
        return;
    } else if(!cache[id]) {
           cache[id] = true;
           return new Promise(resolve => {
                const unsubscribe = store.subscribe(() => {
                if (condition(store.getState())) {
                    unsubscribe();
                    resolve();
                    delete cache[id]
                }
            });
          });
        }
    }
}

你尝试做的事情看起来不错,唯一奇怪的是你没有缓存承诺创造

我认为您必须创建一个映射并缓存已创建的承诺,这样您就不会为相同的函数创建新的承诺

在这种情况下,我看不到一种方式,你可以有种族条件的问题

大致如下:

const cache = {}

function when(store, condition, id) {
    if (condition(store.getState())) {
        return;
    } else if(!cache[id]) {
           cache[id] = true;
           return new Promise(resolve => {
                const unsubscribe = store.subscribe(() => {
                if (condition(store.getState())) {
                    unsubscribe();
                    resolve();
                    delete cache[id]
                }
            });
          });
        }
    }
}

我不确定我是否理解缓存在那里发生了什么。您的描述说您正在缓存承诺,但您的代码看起来像是在缓存值
true
。它缓存特定函数调用id的值true,因此,如果下次出现相同的函数,它将不会再次重新创建承诺。这是一个简单的缓存系统。我不确定我是否理解缓存在那里发生了什么。您的描述说您正在缓存承诺,但您的代码看起来像是在缓存值
true
。它缓存特定函数调用id的值true,因此,如果下次出现相同的函数,它将不会再次重新创建承诺。这是一个简单的缓存系统,非常有趣。调用resolve()时,它将承诺回调排入微任务队列。当当前调用堆栈为空时,微任务队列上的项仅计划由事件循环执行。如果在分派操作时调用了resolve(),事件循环将首先运行分派到完成(这意味着无法再保证条件为true),然后开始从微任务队列中提取承诺回调。因此,您需要额外的步骤来确保担保。但我不确定这些步骤是什么。非常有趣。调用resolve()时,它将承诺回调排入微任务队列。当当前调用堆栈为空时,微任务队列上的项仅计划由事件循环执行。如果在分派操作时调用了resolve(),事件循环将首先运行分派到完成(这意味着无法再保证条件为true),然后开始从微任务队列中提取承诺回调。因此,您需要额外的步骤来确保担保。但我不确定这些步骤是什么。