NodeJS异步/等待不等待上一个请求响应

时间:2018-10-11 07:19:30

标签: jquery node.js express

active

在按键上,我用输入搜索参数调用了以下函数,但问题是第二个请求/响应在第一个请求/响应到来之前得到了。

docker info
Storage Driver: overlay2
Backing Filesystem: extfs
Supports d_type: true
Native Overlay Diff: true

4 个答案:

答案 0 :(得分:0)

正如mtkopone在评论中提到的那样,您必须使用去抖动逻辑来执行此操作。即使await / async保证FCFS(先到先服务),它也只能位于同一异步函数中。

在每个keyup事件中,都会创建一个匿名匿名函数的新实例,并且每个等待都保持独立。

您始终必须记住,await / async并没有任何作用

 await x = y()

等于

 y.then(x => {})

答案 1 :(得分:0)

这是一种解决方法:

let options = {
   projection: {
        'myList.$': 1
    }
}

答案 2 :(得分:0)

对于每个键入,您都将异步发布一个http请求。在这种情况下,您可以为ajax请求设置一个全局变量,如果触发了新请求,则可以中止该多次请求。

例如,

var test = null;

for (var i = 0; i < 10; i++) {
    if(test){ test.abort(); test = null }
    test = $.post(); // your post request
}

在上面的示例中,我异步触发了10个ajax请求,但仅发布了最后一个请求。其他请求将被中止。

答案 3 :(得分:0)

如果您不再想要响应,则需要取消或忽略请求。如果您未设置超时,则响应可以以任何顺序到达,也可以在任何时间后到达。

最好的解决方案是如果结果不再有用,则取消请求。您有几种选择:

  1. 提出新请求(xhr.abort时取消上一个请求
  2. 取消收到新响应时尚未完成的旧请求

示例:

$("#searchText").on("keyup", async function () {
     if (xhr) xhr.abort();
     let search = $.trim($(this).val());
     let result = await getData({ search: search });
});