Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:等待Post请求的状态码_Javascript_Node.js_Post - Fatal编程技术网

Javascript NodeJS:等待Post请求的状态码

Javascript NodeJS:等待Post请求的状态码,javascript,node.js,post,Javascript,Node.js,Post,背景: 我有一个网关,如果完全启动,它会通过post请求返回状态代码200。如果不是,则在引导时返回500 我的想法: 我有一个NodeJS应用程序,它应该等到网关返回200。所以我创建了一个while循环来检查网关的状态 我的问题: 不幸的是,什么都不起作用,状态总是true。将显示请求中的非日志语句 你有什么建议可以帮我解决这个问题吗 while (isGatewayUnavailable()) { log.info('waiting for gateway ...'); sleep

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

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

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

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

while (isGatewayUnavailable()) {
  log.info('waiting for gateway ...');
  sleep(60)
}
JS中没有“等待”。只有“运行代码”和“响应信号运行代码”(事件、回调、承诺)。在这种情况下,您希望基于一个不控制计时的进程执行某些操作,因此无法使用同步函数:当函数到达其
return
关键字时,您还没有任何要返回的信息

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

1.基于事件的:
constpubsub=。。。;
函数checkGatwayAvailability(){
request.post(url,(err,res,body)=>{
publisub.signal(“网关:可用性”,{available:…,error:…});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
在这种情况下,调用此函数的代码和处理结果的代码彼此100%分离。还要注意的是,
pubsub
不是真的。根据您的框架和API,将有不同的方法来实现事件生成/处理,或者您甚至可能需要编写自己的方法(这实际上意味着“访问npm,找到一个被许多人很好地记录和使用的方法,然后使用它”)

2.使用回调:
功能检查网关可用性(报告结果){
request.post(url,(err,res,body)=>{
reportResult({可用:…,错误:…});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
在这种方法中,调用和处理代码在调用指向处理程序的意义上是耦合的,即使处理程序声明在完全不同的地方,例如:

checkGatwayAvailability(NetworkMonitor.handleGatewayResponse);
3.使用承诺:
功能检查网关可用性(报告结果){
返回新承诺((解决、拒绝)=>{
request.post(url,(err,res,body)=>{
如果(错误)拒绝(错误);
决心(…);
});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
与回调类似,调用代码和处理代码是耦合的,但由于承诺您不会“猜测”结果信息是好是坏,因此对于“好”情况(由
then
处理)和“坏”情况(由
catch
处理),您实际上有单独的代码路径

3b。通过
async
/
await
语法使用承诺: 在这种情况下,
request.post
不会返回承诺,您的函数仍然需要烘焙自己的承诺,因此使用
async
声明没有多大意义。我们仍然可以在调用代码中使用
wait
关键字,不过:

试试看{
const result=等待checkGatwayAvailability();
}捕获(e){
...
}
但只有当调用方代码本身在
异步
上下文中运行时,JS中才没有“等待”。只有“运行代码”和“响应信号运行代码”(事件、回调、承诺)。在这种情况下,您希望基于一个不控制计时的进程执行某些操作,因此无法使用同步函数:当函数到达其
return
关键字时,您还没有任何要返回的信息

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

1.基于事件的:
constpubsub=。。。;
函数checkGatwayAvailability(){
request.post(url,(err,res,body)=>{
publisub.signal(“网关:可用性”,{available:…,error:…});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
在这种情况下,调用此函数的代码和处理结果的代码彼此100%分离。还要注意的是,
pubsub
不是真的。根据您的框架和API,将有不同的方法来实现事件生成/处理,或者您甚至可能需要编写自己的方法(这实际上意味着“访问npm,找到一个被许多人很好地记录和使用的方法,然后使用它”)

2.使用回调:
功能检查网关可用性(报告结果){
request.post(url,(err,res,body)=>{
reportResult({可用:…,错误:…});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
在这种方法中,调用和处理代码在调用指向处理程序的意义上是耦合的,即使处理程序声明在完全不同的地方,例如:

checkGatwayAvailability(NetworkMonitor.handleGatewayResponse);
3.使用承诺:
功能检查网关可用性(报告结果){
返回新承诺((解决、拒绝)=>{
request.post(url,(err,res,body)=>{
如果(错误)拒绝(错误);
决心(…);
});
});
}
使用呼叫者代码:

const pubsub = ...;
pubsub.register("gateway:availability", data => {...});

...

checkGatewayAvailability();
checkGatwayAvailability( result => {
  ...
});
checkGatwayAvailability().then(result => {...}).catch(err => {...});
与回调类似,调用和处理代码是耦合的,但承诺不会“猜测”结果信息是否正确