从 NodeJS 重复调用 Rest Endpoint
Repeatedly calling Rest Endpoint from NodeJS
我是 Node 家族的新手。我有一个暴露了两个端点的服务。一种是 post 方法 - 它接受有效载荷(异步处理)并立即向调用者发送确认。另一个是 get 方法 - 用于检查早期请求的状态。
例如:
让我们假设两个端点
(1) http://localhost:8080/myservice/process/11
PayLoad - Any JSON Object
Response: "Request Received. Under Process"
(2) http://localhost:8080/myservice/checkstatus/11
Response: "In-Progress" or "Completed"
我必须从 Node 模块调用第一个端点,然后端点将以确认响应。然后在收到 ack 后,我需要继续调用第二个 GET 端点,除非它有响应 "Completed".
我无法理解如何重复调用端点。
任何小代码片段都将帮助我理解相同的内容。
提前致谢。
您可以为此使用 setInterval
:
请注意:以下是伪代码,仅供参考。复制粘贴不会产生有效的解决方案。
service.post('url-1', payload).then(function(response){
var timer = setInterval(function(){
service.get('url-2').then(function(resp){
if(resp.data == 'Completed') clearInterval(timer);
});
}, 1000);
});
这将每半秒轮询一次服务,直到它收到与 endingCondition
匹配的响应(无论您想要什么)。请注意,原生 Promises 没有 'denodeify' 函数,尽管它很容易编写您自己的或使用第三方库。 done
值不是绝对必要的,如果需要可以重构,但允许更多的自省。另请注意,这是一种设计味道:如问题评论中所述,当异步过程完成时,最好简单地 return 来自服务器的响应。
let request = require('request');
let promise = require('promise');
let done = false;
let poll = promise.denodeify(request.get).bind(request);
let p = poll(serviceURL);
let handle = setInterval(() => {
p.then(res => {
if (res === endingCondition) {
done = true;
clearInterval(handle);
}
if (!done) {
p = poll(serviceURL);
}
});
}, 500);
您可以使用 SynJS 来完成此类任务,下面是工作代码:
var SynJS = require('synjs');
var request = require('request');
function requestWrapper(context, url, method, postData) {
console.log('get started:', url, method, postData);
var result = { done: false };
request({
uri: url,
method: method,
postData: postData,
}, function(error, response, body){
result.done = true;
result.body = body;
result.response = response;
console.log('get finished:', url, method, postData);
SynJS.resume(context); // <-indicates that long running functoin is done
});
return result;
}
// synchronous function
function myApiSubmitter(modules) {
var postRes = modules.requestWrapper(_synjsContext, "https://www.google.com/search","POST","asdasd");
SynJS.wait(postRes.done); // <- waits for SynJS.resume, and checks for postRes.done, continues if postRes.done is true
for(var i=0; i<5; i++) {
SynJS.wait(500); // <- waits for 500ms
var getRes = modules.requestWrapper(_synjsContext, "https://www.google.com/","GET",i);
SynJS.wait(getRes.done); // <- waits for SynJS.resume, and checks for getRes.done, continues if getRes.done is true
if(getRes.body.indexOf('some_success_message')>=0) // <- some arbitrary condition to break the cycle
break;
}
};
var modules = {
SynJS: SynJS,
requestWrapper: requestWrapper,
};
SynJS.run(myApiSubmitter,null,modules,function () {
console.log('done');
});
它将产生以下输出:
get started: https://www.google.com/search POST asdasd
get finished: https://www.google.com/search POST asdasd
get started: https://www.google.com/ GET 0
get finished: https://www.google.com/ GET 0
get started: https://www.google.com/ GET 1
get finished: https://www.google.com/ GET 1
get started: https://www.google.com/ GET 2
get finished: https://www.google.com/ GET 2
get started: https://www.google.com/ GET 3
get finished: https://www.google.com/ GET 3
get started: https://www.google.com/ GET 4
get finished: https://www.google.com/ GET 4
done
我是 Node 家族的新手。我有一个暴露了两个端点的服务。一种是 post 方法 - 它接受有效载荷(异步处理)并立即向调用者发送确认。另一个是 get 方法 - 用于检查早期请求的状态。
例如:
让我们假设两个端点
(1) http://localhost:8080/myservice/process/11
PayLoad - Any JSON Object
Response: "Request Received. Under Process"
(2) http://localhost:8080/myservice/checkstatus/11
Response: "In-Progress" or "Completed"
我必须从 Node 模块调用第一个端点,然后端点将以确认响应。然后在收到 ack 后,我需要继续调用第二个 GET 端点,除非它有响应 "Completed".
我无法理解如何重复调用端点。 任何小代码片段都将帮助我理解相同的内容。
提前致谢。
您可以为此使用 setInterval
:
请注意:以下是伪代码,仅供参考。复制粘贴不会产生有效的解决方案。
service.post('url-1', payload).then(function(response){
var timer = setInterval(function(){
service.get('url-2').then(function(resp){
if(resp.data == 'Completed') clearInterval(timer);
});
}, 1000);
});
这将每半秒轮询一次服务,直到它收到与 endingCondition
匹配的响应(无论您想要什么)。请注意,原生 Promises 没有 'denodeify' 函数,尽管它很容易编写您自己的或使用第三方库。 done
值不是绝对必要的,如果需要可以重构,但允许更多的自省。另请注意,这是一种设计味道:如问题评论中所述,当异步过程完成时,最好简单地 return 来自服务器的响应。
let request = require('request');
let promise = require('promise');
let done = false;
let poll = promise.denodeify(request.get).bind(request);
let p = poll(serviceURL);
let handle = setInterval(() => {
p.then(res => {
if (res === endingCondition) {
done = true;
clearInterval(handle);
}
if (!done) {
p = poll(serviceURL);
}
});
}, 500);
您可以使用 SynJS 来完成此类任务,下面是工作代码:
var SynJS = require('synjs');
var request = require('request');
function requestWrapper(context, url, method, postData) {
console.log('get started:', url, method, postData);
var result = { done: false };
request({
uri: url,
method: method,
postData: postData,
}, function(error, response, body){
result.done = true;
result.body = body;
result.response = response;
console.log('get finished:', url, method, postData);
SynJS.resume(context); // <-indicates that long running functoin is done
});
return result;
}
// synchronous function
function myApiSubmitter(modules) {
var postRes = modules.requestWrapper(_synjsContext, "https://www.google.com/search","POST","asdasd");
SynJS.wait(postRes.done); // <- waits for SynJS.resume, and checks for postRes.done, continues if postRes.done is true
for(var i=0; i<5; i++) {
SynJS.wait(500); // <- waits for 500ms
var getRes = modules.requestWrapper(_synjsContext, "https://www.google.com/","GET",i);
SynJS.wait(getRes.done); // <- waits for SynJS.resume, and checks for getRes.done, continues if getRes.done is true
if(getRes.body.indexOf('some_success_message')>=0) // <- some arbitrary condition to break the cycle
break;
}
};
var modules = {
SynJS: SynJS,
requestWrapper: requestWrapper,
};
SynJS.run(myApiSubmitter,null,modules,function () {
console.log('done');
});
它将产生以下输出:
get started: https://www.google.com/search POST asdasd
get finished: https://www.google.com/search POST asdasd
get started: https://www.google.com/ GET 0
get finished: https://www.google.com/ GET 0
get started: https://www.google.com/ GET 1
get finished: https://www.google.com/ GET 1
get started: https://www.google.com/ GET 2
get finished: https://www.google.com/ GET 2
get started: https://www.google.com/ GET 3
get finished: https://www.google.com/ GET 3
get started: https://www.google.com/ GET 4
get finished: https://www.google.com/ GET 4
done