在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函数内部引用回调时间过长,会出现什么问题?
答案 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);