首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NodeJS:等待邮政请求的状态代码

NodeJS:等待邮政请求的状态代码
EN

Stack Overflow用户
提问于 2019-11-10 17:11:23
回答 1查看 2.1K关注 0票数 0

背景:我有一个网关,它通过post请求返回状态代码200,如果它是完全引导的。如果没有,则在引导时返回500。

我的想法是:我有一个NodeJS应用程序,应该等到网关返回200。因此,我创建了一个while循环,它检查网关的状态。

我的问题:不幸的是,什么都不起作用,状态总是true。将显示请求中的非日志语句。

你有什么建议可以帮我解决这个问题吗?

代码语言:javascript
运行
复制
while (isGatewayUnavailable()) {
  log.info('waiting for gateway ...');
  sleep(60)
}
代码语言:javascript
运行
复制
function isGatwayUnavailable() {
  const url = '...'
  let state = true

  request.post(url, (err, res, body) => {
    log.debug(0)
    if (err) {
      log.debug("Gateway offline");
      log.debug("err: " + err);

    }
    else if (res.statusCode === 200) {
      log.debug("Gateway online");
      state = false;
      cb(true);
    }
    else {
      log.debug("Status Code: " + res.statusCode);
    }

  });

  log.debug('return state: ' + state);

  return state;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-10 17:25:11

在JS中没有“等待”。只有“运行代码”和“响应信号运行代码”(事件、回调、承诺)。在这种情况下,您想要基于一个不控制时间的进程来做一些事情,因此您不能使用同步函数:当函数到达其return关键字时,您还没有任何信息可返回。

因此,与其让函数返回一个值,让调用者等待该值,不如让代码“一旦信息进入就执行操作”。也就是说,让您的函数生成一个注册了处理程序的事件,或者传递一个回调作为参数,以便函数在得到必要的信息后可以运行该回调,或者让它返回一个承诺,一旦您获得了必要的信息,它的resolve (或reject)就会被调用。

1.以活动为基础:

代码语言:javascript
运行
复制
const pubsub = ...;

function checkGatwayAvailability() {
  request.post(url, (err, res, body) => {
    pubsub.signal("gateway:availability", { available: ..., error: ... });    
  });
}

调用者代码:

代码语言:javascript
运行
复制
const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();

在这种情况下,调用它的代码和处理结果的代码是100%分离的。还请注意,pubsub不是一个真实的东西。根据您的框架和API,将有不同的方法来实现事件的生成/处理,或者您甚至可能需要编写自己的工具(这实际上意味着“启动npm并找到一个被很多人详细记录和使用的机制,然后使用它”)。

2.使用回调:

代码语言:javascript
运行
复制
function checkGatwayAvailability(reportResult) {
  request.post(url, (err, res, body) => {
    reportResult({ available: ..., error: ... });
  });
}

调用者代码:

代码语言:javascript
运行
复制
checkGatwayAvailability( result => {
  ...
});

在这种方法中,调用和处理代码耦合在一起,也就是说您的调用指向处理程序,即使您的处理程序声明在完全不同的地方,例如:

代码语言:javascript
运行
复制
checkGatwayAvailability(NetworkMonitor.handleGatewayResponse);

3.利用承诺:

代码语言:javascript
运行
复制
function checkGatwayAvailability(reportResult) {
  return new Promise((resolve, reject) => {
    request.post(url, (err, res, body) => {
      if (err) reject(err);
      resolve(...);
    });
  });
}

调用者代码:

代码语言:javascript
运行
复制
checkGatwayAvailability().then(result => {...}).catch(err => {...});

类似于回调,调用和处理代码是耦合在一起的,但是通过承诺您不会“猜测”得到的信息是好的还是坏的,您可以为“好”案例(由then处理)和“坏”案例(由catch处理)有单独的代码路径。

3b。通过async/await语法使用承诺:

在这种情况下,request.post不返回承诺,您的函数仍然需要自己的承诺,所以使用async声明没有多大意义。但是,我们仍然可以在调用代码中使用await关键字,不过:

代码语言:javascript
运行
复制
try {
  const result = await checkGatwayAvailability();
} catch (e) {
  ...
}

但是,只有当调用方代码本身在async上下文中运行时,才会这样做。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58791033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档