Javascript 正在等待redux状态满足条件
我有以下函数,它允许我在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(() => {
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),然后开始从微任务队列中提取承诺回调。因此,您需要额外的步骤来确保担保。但我不确定这些步骤是什么。