如何优先考虑承诺结果?

     2023-02-22     116

关键词:

【中文标题】如何优先考虑承诺结果?【英文标题】:how to prioritize promise results? 【发布时间】:2018-11-25 12:02:29 【问题描述】:

我正在开发一个反应应用程序。我需要使用 api 请求的结果来更新状态。现在应用程序运行起来,我必须经常发出 api 请求。因此,一旦结果到达,我就在 then() 中设置状态。但有些结果比其他结果需要更多时间。所以有时前一个承诺的结果会设置状态而不是当前。我如何确定承诺的优先级,以便最新的请求结果设置状态。或者,一旦我打电话给新的承诺,还有其他方法可以摆脱以前的承诺吗?

this.state = 
      searchterm: '',
      isfocused: false,
      current: -1,
      noresults: false,
      // latest promise id
      reqseqid: 0,
      filteredList: []
    


callingfunction()
   let reqseqid = this.state.reqseqid + 1;
    this.setState( 
      searchterm,
      filteredList: [],
      reqseqid
     );
    searchresults(searchterm, reqseqid)
      .then(res => 
        let  results, reqseqid  = res;
        console.log(reqseqid, this.state.reqseqid);
        if(reqseqid === this.state.reqseqid)
          if(res.length === 0)
            this.setState( 
              current: -1,
              filteredList: [],
              noresults: true
             );
          else
            this.setState( 
              current: -1,
              filteredList: results,
              noresults: false
            );
          
        

      );

【问题讨论】:

【参考方案1】:

我通常处理这个问题的方法是使用一个实例属性或类似的变量,异步回调可以检查它的结果是否仍然需要或请求是否过时。例如,在您的构造函数中:

this.ajaxSequence = 0;

然后提出您的要求:

const thisSequence = ++this.ajaxSequence;
doTheAjaxRequest()
    .then(result => 
        if (thisSequence == this.ajaxSequence) 
            // Use the result
        
    )
    .catch(/*...probably check and ignore the error if this request was stale...*/);

不一定是数字。例如:

this.currentRequestPromise = null;

然后

const thisPromise = this.currentRequestPromise = doTheAjaxRequest()
    .then(result => 
        if (thisPromise == this.currentRequestPromise) 
            // Use the result
        
    )
    .catch(/*...probably check here too...*/);

【讨论】:

【参考方案2】:

您应该查看执行流程的 observables。您正在寻找的是非同时展平一个承诺流,这可以通过 xstream 之类的库轻松完成:

const xs = require("xstream").default;
const promise$ = ... // create a stream of promises
return promise$.map(p => xs.fromPromise(p)).flatten();

创建一个 Promise 流很容易,假设您需要定期获取,您可以拥有

const promise$ = xs.periodic(500).map(() => makeApiCall());

我强烈建议您朝这个方向看。尝试在组件生命周期中直接处理 Promise 并不简单,可能应该在 Redux 中间件(或其他状态管理实用程序)中完成。例如,它要求您在 Promise 的回调中跟踪组件的挂载/卸载状态,否则您可能会对未挂载的组件进行操作。这也可能导致内存泄漏。

【讨论】:

这会导致对已知过时的完成进行不必要的组件状态更新,不是吗?因为您按照结果开始的顺序处理结果,即使后面的结果在前面的结果之前完成,所以不再需要前面的结果。 不在我发布的内容中。每次新的 Promise 到达时,前一个 Promise 都会被丢弃。 好的,很酷,谢谢。如果其他人也有同样的疑问,我会留下评论。 您描述的是流连接,您在处理下一个之前等待一个完成。我建议的是扁平化,这是不同的。非并发时,它会在新的流出现时丢弃当前流,同时它会尽可能多地打开订阅。【参考方案3】:

有很多方法可以做到这一点。我喜欢的一种方法是拥有一个对象实例(requestSequence of sorts)来跟踪收到的请求,以及每个请求的递增索引值。当请求/承诺返回时,检查该请求索引的索引是否 >= 您已经从 requestSequence 返回的 largestIndex。如果是,则返回该结果,并增加largestIndex。否则,不要返回该值。

这种方法的好处是这段代码的调用者可以随心所欲地发出请求,requestSequence 将确保顺序。调用者不必关心过期请求或检查返回值是否与当前输入匹配。

【讨论】:

我确实尝试过类似的方法。所以请求序列只是不断增加。对吗? 是的。它可能是您递增的整数,也可能是时间戳(除非您的请求出现的频率高于每毫秒一次)。详情:requestSequence 是一个实例,它在实例内存储一个索引(避免全局状态)。

如何按顺序执行承诺并返回所有结果[重复]

】如何按顺序执行承诺并返回所有结果[重复]【英文标题】:Howtoexecutepromisesinorderandreturnallresults[duplicate]【发布时间】:2019-10-1107:30:01【问题描述】:我不熟悉承诺。我已经按顺序查找了执行Promise的示例,但没有找到与我的应用... 查看详情

如何使用使用承诺的函数的结果

】如何使用使用承诺的函数的结果【英文标题】:Howtouseresultofafunctionthatusespromises【发布时间】:2017-04-3009:45:09【问题描述】:我有一个函数,asdf()vara=fooController.getOrCreateFooByBar(param);console.log("trynadothing");console.log(a);//undefinedif(!a.... 查看详情

如何在 Express 4 中将承诺的收益结果作为流发送?

】如何在Express4中将承诺的收益结果作为流发送?【英文标题】:Howtosendresultofanyieldonapromiseasastreaminexpress4?【发布时间】:2016-06-1500:28:00【问题描述】:有什么方法可以将产生承诺的结果作为蒸汽发送?在某些情况下JSON负载会很... 查看详情

优先考虑 SQL WHERE 子句

】优先考虑SQLWHERE子句【英文标题】:PrioritizeSQLWHEREclause【发布时间】:2012-11-2913:40:44【问题描述】:基本上我想这样做:SELECT*FROM`table`WHEREx=\'hello\'ORx=\'bye\'LIMIT1\';我希望它返回1个值,但优先考虑第一个where子句的结果。因此,... 查看详情

如何阻止 javascript 承诺并返回已解决的结果? [复制]

】如何阻止javascript承诺并返回已解决的结果?[复制]【英文标题】:Howtoblockforajavascriptpromiseandreturntheresolvedresult?[duplicate]【发布时间】:2015-06-0901:00:31【问题描述】:我显然误解了js承诺的解决方式或“返回”的语义。我被一个... 查看详情

量角器 - 如何将一组承诺的结果放入另一个数组

】量角器-如何将一组承诺的结果放入另一个数组【英文标题】:protractor-howtogettheresultofanarrayofpromisesintoanotherarray【发布时间】:2014-03-1106:23:02【问题描述】:我从这段代码中得到了一系列承诺:element.all(by.repeater(\'unitinunits\')),... 查看详情

在多维数组中获取承诺的结果

...在每个数组中都有承诺以及[[PromiseStatus]]和[[PromiseValue]]。如何获得承诺值?这是一段代码:(resourcePromises只 查看详情

如何通知 cmake 优先考虑某个文件

】如何通知cmake优先考虑某个文件【英文标题】:Howtoinformcmaketoprioritizeacertainfile【发布时间】:2019-09-0502:47:50【问题描述】:有没有办法通知CMake生成构建图,以便构建过程优先考虑特定文件?基本上,我希望在构建过程中尽快... 查看详情

如何优先考虑 TextView 截断

】如何优先考虑TextView截断【英文标题】:HowtoprioritizeTextViewtruncation【发布时间】:2021-11-1320:04:55【问题描述】:我有两个横向约束在一起的长文本。由于两个文本都可能很长,因此都用省略号截断。这是供参考的图表。|[文本... 查看详情

你如何优先考虑全局构造函数?

】你如何优先考虑全局构造函数?【英文标题】:Howdoyouprioritizeglobalconstructors?【发布时间】:2016-03-1201:39:08【问题描述】:我有一个使用Qt的共享库版本(5.2.0)编写的程序,它显示的字体正常(大概是从/usr/share/fonts填充它的数据... 查看详情

如何在选择期间优先考虑空值

】如何在选择期间优先考虑空值【英文标题】:Howtotogivepreferencetonullvalueduringselect【发布时间】:2020-02-0903:56:18【问题描述】:我有一张桌子Idvalue1000null1000En1000Fr1000Es1001En1001Fr1001Es选择查询的输出应如下所示。(由于1000只有空值... 查看详情

如何在线程中优先考虑用户定义的消息?

】如何在线程中优先考虑用户定义的消息?【英文标题】:howtoprioritizeuserdefinemessagesinathread?【发布时间】:2009-08-2811:27:17【问题描述】:我只有一个线程(Windows应用程序)接收窗口和用户定义的消息。现在,当用户单击鼠标并... 查看详情

如何在 MultiOutput LSTM Tensorflow 中优先考虑某些输出?

】如何在MultiOutputLSTMTensorflow中优先考虑某些输出?【英文标题】:HowtoprioritisecertainoutputinMultiOutputLSTMTensorflow?【发布时间】:2021-10-2802:44:55【问题描述】:基本上,我正在使用Tensorflow创建一个LSTM模型,我的输入数据的形状类似... 查看详情

如何在 Scala 中优先考虑演员之间发送的消息?

】如何在Scala中优先考虑演员之间发送的消息?【英文标题】:HowtoprioritizemessagessentbetweenactorsinScala?【发布时间】:2015-09-1107:44:44【问题描述】:我正在尝试从子角色到父角色捕获“终止信号”,但是在死信消息池中,信号无法... 查看详情

priority是啥意思

priority是英文中优先、优先权、优先次序以及优先考虑的事,上席,上位;是名词,复数是priorities,此外也有做形容词的,表示优先的。英文意思是Thethingthatyouthinkismostimportantandthatneedsattentionbeforeanythingelse;therighttobegivenattentionfi... 查看详情

优先考虑组件弹簧启动

...nentsspringboot【发布时间】:2022-01-1622:31:46【问题描述】:如何优先加载组件?【问题讨论】:请添加一些代码以明确alistwiththecomponents的含义。否则请阅读@Order我换个问题。【参考方案1】:我发现@Order注释会起作用https://docs.spring... 查看详情

如何对 python 3 中的列表进行排序,优先考虑特定值?

】如何对python3中的列表进行排序,优先考虑特定值?【英文标题】:HowcanIsortalistinpython3withprioritygiventospecificvalues?【发布时间】:2020-05-0523:14:28【问题描述】:我有一个名为V的列表。V的元素将是以下之一:0,1,2或+inf我想对此列... 查看详情

WooCommerce find_matching_product_variation() - 当它们很少时如何优先考虑变化?

】WooCommercefind_matching_product_variation()-当它们很少时如何优先考虑变化?【英文标题】:WooCommercefind_matching_product_variation()-howtoprioritizevariationwhentherearefewofthem?【发布时间】:2020-03-1004:48:07【问题描述】:所以我通过将属性与此函... 查看详情