这是什么意思? (异步编程)

时间:2018-02-10 18:19:19

标签: javascript asynchronous

this书(Eloquent JS)中,这里

function request(nest, target, type, content) {
  return new Promise((resolve, reject) => {
    let done = false;
    function attempt(n) {
      nest.send(target, type, content, (failed, value) => {
        done = true;
        if (failed) reject(failed);
        else resolve(value);
      });
      setTimeout(() => {
        if (done) return;
        else if (n < 3) attempt(n + 1);
        else reject(new Timeout("Timed out"));
      }, 250);
    }
    attempt(1);
  });
}

作者继续说

  

如果请求确实通过,但处理程序,甚至可能   只需要更长的时间,就可以提供多个请求   次

我无法理解作者在哪种情况下意味着会多次发送请求?

我理解send可能会被调用两次,如果它需要1秒钟来响应,但恕我直言,这不是作者在引用中引用的场景,给出了引用的写法(即使在那种情况下我不要认为这是一个问题,因为诺言只解决了一次)。

如果他在send函数内部引用回调时间过长,会出现什么问题?

  • 如果一旦请求到达,回调花费太长时间说3秒,setTimeout中的回调将不会运行,直到发送回调中的代码完成不是吗? (即使已经过了250ms)。
  • 一旦完成,将是真的,因此第二次不会提出请求。我错过了什么?

1 个答案:

答案 0 :(得分:0)

作者没有将传递给 send 的回调称为处理程序。可以说,处理程序是在服务器上处理您的请求的东西。 send 中的第四个参数是一个函数,当重新获得响应并完成所有需要的工作时,处理程序将调用该函数。

在发出请求之前,您应该确保 crow-tech ,尤其是每个巢穴都支持其类型。因此,您应该使用 defineRequestType 导出了 crow-tech 接口的来为特定类型的请求定义处理程序:

defineRequestType(
    note,
    function handler() { }
);

Crow Nest计算机的构建目的是使用请求-响应进行通信 对。每个请求都标记有类型,该类型决定了请求的方式 处理。您必须为特定的请求类型定义处理程序。当一个 请求进入后,将调用其处理程序以产生响应。但是要 使嵌套能够接收该请求,我们首先必须定义 一个名为“ note”的请求类型。

由于“网络很困难”,因此有时会由于某些障碍而无法发送正在发送的请求。这就是为什么您应该在放弃之前发出3次请求的原因,这是作者所说的任意的

为了与其他设备通信,这些机器使用光信号( 快速闪烁的顺序)。这意味着,只有具有 连续的视觉连接可以交流。

如果巢不可用,在放弃并超时之前,将触发一个请求三遍。

如果嵌套可用,则您的请求“ 将通过”。在这种情况下,处理程序可能需要花费比以前定义的“ 任意任意”更长的时间-您的代码仍在重试,不知道请求“ 是否通过”并正在处理。

有时,处理程序的工作可能会在超时之前及时完成,然后将第一个响应发送回去,然后处理程序将按照其例程进行其他两次尝试。由于承诺已经解决,因此没有什么可担心的,但是我们牢记这一点

您可以像这样模拟“花费太长时间”并查看输出结果:

const TAKING_TOO_LONG = Symbol("taking too long");

requestType(
    TAKING_TOO_LONG,
    async function handlerForTakingTooLong(nest) {
        await new Promise((res) => setTimeout(res, 700));
        return `Here is your response, ${nest.name}`;
    }
);

request(bigOak, "Cow Pasture", TAKING_TOO_LONG, "test message")
    .then(console.log);