gpt4 book ai didi

javascript - 如何使用 NodeJS 同步运行两个函数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:13 25 4
gpt4 key购买 nike

我对 NodeJS 还很陌生,并且对异步机制感到困惑。

我有一个代码,应该将 HTTP post 请求发送到第一个 URL(例如 - https://example.com/first ),然后当它得到状态代码 200 的答复时,向同一服务器发送另一个请求,以检查服务器是否已完成处理第一个请求(例如 - https://example.com/statusCheck )。

如果服务器正忙,则应返回包含“true”的文本/纯文本响应;如果已准备好使用,则应返回“false”。我用 while 循环编写它,每 2 秒查询一次服务器,最多迭代 10 次。

var request = require('request');

var firstURL = "https://example.com/first";
var serverCheck = "https://example.com/statusCheck";

// Sends up to 10 requests to the server
function checkServerStatus(){
var serverReady = false;
var count = 0;
while (!serverReady && count < 10) {
count++;
setTimeout(function(){
request.get(serverCheck, function(err, resp, body){
if (err){
console.log(err);
} else if (body == "false") {
generatorReady = true;
}
})
}, 2000);
}
return generatorReady;
}

// Sends the first request and return True if the response equals to 200
function sendFirstRequest(){
var req = request.post(firstURL, function (err, resp, body) {
if (err) {
console.log(err);
return false;
} else if (resp.statusCode === 200){
return true;
} else {
return false;
}
});
};


module.exports = function (){
// Sends the first request
var firstRequestStatus = sendFirstRequest();
if (firstRequestStatus) {
return checkServerStatus();
}
};

换句话说,我想先运行sendFirstRequest,等待响应,如果响应为true,我想运行checkServerStatus并获取他的返回值。如果可以在每次迭代之间进行 sleep ,那就太好了(因为 setTimeout 对我来说也不起作用)。

编辑:我听说我可以使用 function* 和 Yieldasync-await 来避免回调 hell - 在这种情况下我该如何实现它们?

最佳答案

您应该使用 Promise 来执行此操作。下面是一些使用 bluebird 的代码这会做你想做的事。 Promise.any方法将返回 10 次尝试中第一个成功调用的数组。

const Promise = require('bluebird');
var request = Promise.promisifyAll(require('request'));

var firstURL = "https://example.com/";
var serverCheck = "https://example.com/statusCheck";

request.postAsync(firstURL).then(res => {
if (res.statusCode === 200) return true;
throw new Error('server not ready');
}).then(() =>
Promise.any(new Array(10).fill(request.getAsync(serverCheck)))
).then(res => {
console.log(res);
}).catch(err => console.log(err));

关于javascript - 如何使用 NodeJS 同步运行两个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45461567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com