1

我对 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"

从节点模块,我必须调用第一个端点,然后端点会以确认响应。然后在收到确认后,我需要继续调用第二个 GET 端点,除非它有响应“已完成”。

我无法理解如何反复调用端点。任何小代码片段都将帮助我理解相同的内容。

提前致谢。

4

3 回答 3

1

您可以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);
});
于 2017-01-10T18:28:35.513 回答
0

这将每半秒轮询一次服务,直到它得到一个匹配的响应endingCondition(无论你想要什么)。请注意,本机 Promises 没有“denodeify”功能,尽管它很容易编写您自己的或使用第三方库。该done值不是绝对必要的,如果需要可以重构,但允许更多的自省。另请注意,这是一种设计气味:如对问题的评论中所述,最好在异步过程完成时简单地返回来自服务器的响应。

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);
于 2017-01-10T18:34:28.250 回答
0

您可以将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
于 2017-01-10T19:46:29.867 回答