当前位置: 首页 > 知识库问答 >
问题:

异步搜索promise不按顺序解析

汝和裕
2023-03-14

我这里的问题是,获取promise在当前文本之前创建了几个字符,然后在最后创建的promise之后解析。我需要解决的最后一个promise的最新或取消以前的promise时,我改变了文本。

我希望结果总是最新的。

我查找了一些搜索栏示例,但什么也没找到。

我很确定解决方案是保存以前的promise,如果在你创建一个新promise时它仍然悬而未决,就取消它,但是我不知道如何取消promise。

谢谢帮忙。

import React, {useEffect, useState, Fragment} from "react";

function TestComponent () {
    const [text, setText] = useState('');
    const [results, setResults] = useState([]);
    
    useEffect(() => {
        (async () => {
            await getResults();
        })();
    }, [text]);
    
    async function getResults() {
        let resultsFromFetch = await fetch('url');
        resultsFromFetch = await resultsFromFetch.json();
        setResults(resultsFromFetch);
    }
    
    function onChange(evt) {
        setText(evt.target.value);
    }
    
    return (
        <Fragment>
            <input type="text" value={text} onChange={onChange}/>
            {results.map((value, index) => {
                return <p key={index}>{value}</p>;
            })}
        </Fragment>
    );
}

export default TestComponent;

注意:在我遇到的实际问题中,我没有使用fetch,而只是一个异步indexeddb操作。

共有1个答案

方飞白
2023-03-14

我找到了一个答案,它并没有真正取消promise,但它停止了函数设置结果。

添加一个额外的状态变量:const[取消令牌,set取消令牌]=useState(null);

更改效果:

useEffect(() => {
    if (cancelToken) {
        cancelToken.cancel(); // execute the cancel function of the previous search
    }

    let newCancelToken = {}; // create an empty object to pass into the getResults function

    getResults(cancelToken);

    setCancelToken(newCanelToken); // change the state variable to the new cancel token
}, [text]);

更改getResults函数:

async function getResults(newCancelToken) {
    let canceled = false; // create a local canceled variable
    newCancelToken.cancel = () => {
        canceled = true; // change it to true when the cancel function is called
    };
    let resultsFromFetch = await fetch('url');
    resultsFromFetch = await resultsFromFetch.json();

    if (!canceled) {
         setResults(resultsFromFetch); // only change the state if it is not canceled
    }
   
}
 类似资料:
  • 本文向大家介绍Javascript异步执行不按顺序解决方案,包括了Javascript异步执行不按顺序解决方案的使用技巧和注意事项,需要的朋友参考一下 案例分析: 比如执行懒加载时候,onscroll 事件触发多次事件时候会调用多次 ajax 回调事件,由于每个事件返回先后次序并不能保证和触发前一致,所以在数据响应返回后所添加的数据顺序就很在 push 到数组上顺序不一致。 例子1: 这里的并发“

  • 问题内容: 考虑: 查询将是这样的: 如何实现按孩子计数? 换句话说,返回的TParent列表的顺序将由TChildSet计数决定。 我知道@Formula可以在SQL环境中使用。我不确定Lucene是否可以使用类似的东西? 任何帮助,指点,评论甚至批评都欢迎。 非常感谢约翰 问题答案: 在hibernate搜索中,您可以为此创建一个自定义Bridge。 类似于以下内容: 使用自定义桥实现:

  • 如何在按分页顺序聚合术语字段后获取记录。到目前为止,我有这个: 我对此进行了研究,有人说,通过使用复合聚合或分区,这是可能的。但我不知道我如何才能真正做到这一点。 我也查看了bucket\u sort,但我似乎无法使其发挥作用: 我对这件事很在行。请帮帮我。谢谢

  • 考虑以下以串行/顺序方式读取文件数组的代码。返回一个promise,该promise仅在按顺序读取所有文件后才解析。 上面的代码可以工作,但我不喜欢必须为事情按顺序发生而做递归。有没有更简单的方法可以重写这段代码,使我不必使用我怪异的函数? 最初,我尝试使用,但这导致所有调用并发发生,这不是我想要的:

  • 问题内容: 我正在使用Node.js运行服务器,并且需要从正在运行的另一台服务器()请求数据。我需要向数据服务器发出许多请求(〜200)并收集数据(响应大小从〜20Kb到〜20Mb不等)。每个请求都是独立的,我想将响应保存为以下形式的一个巨大数组: 请注意,项目的顺序并不重要,理想情况下,它们应该以数据可用的顺序填充数组。 现在,当运行该程序时,它将显示: 现在,由于文件的大小如此可变,我期望它可

  • 我正在使用javax。servlet获取关于用户完成的付款状态的异步通知。每个通知都包含需要在数据库中更新的信息,例如-用户详细信息、支付金额、付款id、付款状态等。。。 例如,id=1的一次付款的一组通知: 即使通知是异步的,数据库更新也必须是有序的,所以当我更新我的支付表时,id=1的支付条目必须首先更新为状态“新”,然后更新为“PENDING”,然后更新为“COMPLETED”。 其他一些内