我真正遇到的问题是.includes()
方法的行为不稳定。我用它来检查用户输入的单词是否是有效的单词,比如allWords.includes(userWord)
。它通常返回false
,而不管是否包含单词。allWords大约有12000个元素,我想我需要异步调用它。
codesandbox中的一个更简单的版本可以工作,但它总是在我的react程序中返回false
。我还是TS和异步编程的新手。计划读一本关于它的书,但想先完成这个该死的程序。
这是我的异步函数
//helpers.ts
export async function validateGuess(guess: GuessCharacter[]): Promise<boolean> {
async function includesPromise(array: string[], word: string) {
return new Promise<boolean>((resolve) => {
resolve(array.includes(word));
});
}
//each letter of word is in an object
let word: string = '';
for (let character of guess) {
word += character.value;
}
return includesPromise(allWords, word).then((result) => result);
}
这就是它被称为的地方
/// index.ts
function handleEnterPress() {
validateGuess(gameState.guesses[gameState.guessCount]).then((response) => {
if (response) {
dispatch(ActionKind.Enter);
} else {
console.log('Not in word list');
}
});
我也试过
async function handleEnterPress() {
let status: boolean = await validateGuess(
gameState.guesses[gameState.guessCount]
);
if (status) {
dispatch(keyAction.Enter);
} else {
console.log('Not in word list');
}
}
感谢所有的帮助。谢谢
您的逻辑看起来不错。
有几件事:
gameState.guesses
包含什么?要使逻辑工作,它应该是objects
的array
,具有名为value
的属性,该属性应该是可迭代的- 如果gameState.guess[i]是字符串,则不应执行
word += character.value
,而应执行:word += character
gameState.guessCount
不应大于(gameState.guesses.length - 1)
,否则会得到一个未定义的值- 一旦异步操作成为内存中的操作,您就不需要在那里使用它,这样做不会更快,也不会为其他任务腾出处理时间
主要问题是您认为此行返回result
。事实并非如此。它返回未解决的承诺。当承诺得到解决时(因为您添加了.then()
,所以结果被传递……但随后它就丢失了。
return includesPromise(allWords, word).then((result) => result);
你可以等待它来获得承诺的价值。最好不要混合async/await和.then((/.catch((.
编辑:。。。其他人的评论也是有效的。