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

Javascript 这里是什么意思?(异步编程),javascript,asynchronous,Javascript,Asynchronous,在书中(雄辩的JS),这里 功能请求(嵌套、目标、类型、内容){ 返回新承诺((解决、拒绝)=>{ 完成=错误; 函数尝试(n){ 发送(目标,类型,内容,(失败,值)=>{ 完成=正确; 如果(失败)拒绝(失败); 否则解决(价值); }); 设置超时(()=>{ 如果(完成)返回; 否则,如果(n

在书中(雄辩的JS),这里

功能请求(嵌套、目标、类型、内容){
返回新承诺((解决、拒绝)=>{
完成=错误;
函数尝试(n){
发送(目标,类型,内容,(失败,值)=>{
完成=正确;
如果(失败)拒绝(失败);
否则解决(价值);
});
设置超时(()=>{
如果(完成)返回;
否则,如果(n<3)尝试(n+1);
else拒绝(新超时(“超时”);
}, 250);
}
企图(1);
});
}
作者接着说

如果请求确实通过了,但是处理程序 只需稍长一点,就可以将请求传递到多个 时报

我不明白在哪种情况下,作者的意思是请求将被多次传递

我理解
send
可能会被调用两次,如果响应需要1秒,但鉴于引用的编写方式,作者在引用中提到的情况并非如此(即使在这种情况下,我也不认为这是一个问题,因为承诺只解决了一次)


如果他提到发送函数中的回调花费的时间太长,那么问题是什么

  • 如果一旦请求到达,回调就需要太长的时间,比如说3秒钟,那么setTimeout中的回调将不会运行,直到send回调中的代码完成,不是吗?(即使250毫秒已经过去)
  • 一旦完成,则“完成”将为真,因此不会再次发出请求。我错过了什么

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

      在发出请求之前,您应该确保crowtech,特别是每个嵌套都支持其类型。因此,您应该使用导出的defineRequestType为特定类型的请求定义一个处理程序

      defineRequestType(
          note,
          function handler() { }
      );
      
      Crow nest计算机是为使用请求-响应进行通信而构建的 对。每个请求都标记有一个类型,该类型决定了它是如何处理的 处理。必须为特定请求类型定义处理程序。当 请求进入时,调用其处理程序以生成响应。但是 要使嵌套能够接收该请求,我们首先必须定义 名为“note”的请求类型

      由于“网络是硬的”,可能会有一些情况下,由于一些障碍物的干扰,发送的请求无法到达。这就是为什么你应该在放弃之前发出3次请求,正如作者所说,这有点武断

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

      如果嵌套不可用,请求将被触发三次,然后放弃并超时

      如果巢穴可用,您的请求“将通过”。在这种情况下,处理程序可能需要比以前定义的“有点随意”更长的时间来完成它所需要的任何事情-您的代码仍在重试,不知道请求是否“通过”并正在处理

      有时,处理程序的工作可能在超时之前及时完成,第一个响应被发送回,然后处理程序按照其例程进行其他两次尝试。既然承诺已经解决了,没有什么好担心的,但我们要记住这一点

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

      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);
      

      作者所说的只是您已经理解的:
      send
      方法可以调用两次。他们的观点是,在执行
      send
      (即de-handler)时应该小心:它应该能够很好地处理使用相同数据重复调用
      send
      (即请求),即使处理程序已经触发了对前面调用
      send
      @trincot的响应,我不知道在哪种情况下可以调用两次
      send
      ;嗯,我有一个我在讨论中提到的场景,但我怀疑这和(书)作者引用的场景是一样的。如果
      send
      的实现需要等待一些事情发生(数据库事务完成,…等等),那么调用回调可能需要更长的时间。在此等待时间内,此代码中的计时器可能会过期,并再次调用
      send
      send
      的实现可能已经准备好并调用了前面请求的回调,现在需要再次处理相同的请求。所以它会再次调用回调。@trincot你可能必须再看一次我的问题。你描述的情况也是我在问题末尾提到的,不是吗?问题是作者在引用中提到的场景(send可以调用两次),我想这不是我和你谈论的同一场景吗?至少是他用英语表达的方式。e、 g.他说的是“handler只是花了一点时间”,而他当时不得不说“请求需要花更长的时间才能到达”。是的,就是这种情况,这也是作者所意识到的,并在此基础上进行了扩展。它与他们使用的“请求”、“返回”、“处理程序”等词相匹配。
      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);