轮询REST API以执行长时间运行的任务

时间:2017-06-22 15:10:43

标签: javascript node.js rest

我正在设计REST API来执行一些需要大量计算的任务,以供其他服务使用。实质上,对/command的GET请求将开始执行任务,状态将在/queue/12345更新。客户端轮询/queue/12345/直到任务完成,此时服务器发送303,其中包含结果的位置(/runs/12345)。

我现在要做的就是在客户端编写轮询功能。我现在可以成功轮询 - 但是,因为在发送请求后立即调用setTimeout()函数。这意味着即使我没有在请求的回调函数中调用setTimeout(),我也将永远进行轮询。

如果我收到303状态代码,如何确保我的轮询功能结束?

// standard first call is pollQueue(uri, 0);
function pollQueue(uri, timesPolled, callback) {
    if(timesPolled > 28800) {
        // 288800 is (60 sec/min * 60 min/hr * 24 hr) / 3 sec/poll. Aka 24 hours.
        throw 'ResourceWillNeverBeReady';
    }

    console.log("polling " + uri);
    request({
      url: "http://localhost:2500/" + uri,
      followRedirect: false
    }, function (error, response, body) {
        if(response.statusCode === 303) {
            // callback handles requesting the actual data
            callback(response.headers.location); 
            return;
        }
    });

    setTimeout(function() { pollQueue(uri, timesPolled + 1, callback);}, 3000);
}

1 个答案:

答案 0 :(得分:1)

凯文B指出了显而易见的事实。我需要做的就是将setTimeout()函数移动到回调中。

// standard first call is pollQueue(uri, 0);
function pollQueue(uri, timesPolled, callback) {
    if(timesPolled > 28800) {
        // 288800 is (60 sec/min * 60 min/hr * 24 hr) / 3 sec/poll. Aka 24 hours.
        throw 'ResourceWillNeverBeReady';
    }

    console.log("polling " + uri);
    request({
      url: "http://localhost:2500/" + uri,
      followRedirect: false
    }, function (error, response, body) {
        if(response.statusCode === 303) {
            // callback handles requesting the actual data
            callback(response.headers.location); 
            return;
        }

        setTimeout(function() { pollQueue(uri, timesPolled + 1, callback);}, 3000);
    });
}