Javascript 节点js在20秒后发送多个请求
如果响应延迟20秒,我的node js应用程序将发出多个http请求。下面是相同的示例代码 首先,我从浏览器调用getAPI函数。getApi函数调用getAccessTokenAPI,在收到accesstoken后,我调用testApi。现在,如果testApi的响应延迟20秒,则会再次调用GetAccessTokenAPI。我不想用承诺。有人能指出我在这里遗漏了什么或做错了什么吗Javascript 节点js在20秒后发送多个请求,javascript,node.js,Javascript,Node.js,如果响应延迟20秒,我的node js应用程序将发出多个http请求。下面是相同的示例代码 首先,我从浏览器调用getAPI函数。getApi函数调用getAccessTokenAPI,在收到accesstoken后,我调用testApi。现在,如果testApi的响应延迟20秒,则会再次调用GetAccessTokenAPI。我不想用承诺。有人能指出我在这里遗漏了什么或做错了什么吗 shttp = require('http-https'); exports.getAPI = funct
shttp = require('http-https');
exports.getAPI = function(typeObj, request, response, callback) {
var userConf; //contains info such as port, host, url etc
_this.getAccessToken(function(tokenResponse) {
var tokenInfo = JSON.parse(tokenResponse);
var accessToken = JSON.parse(tokenInfo.response);
accessToken = accessToken.access_token;
if(accessToken) {
_this.testApi(userConf,accessToken,function(sjmResponse) {
callback(sjmResponse);
}
} else {
callback(JSON.stringify({"payLoad":null,"reasonCode":"fail","status":null}));
}
});
};
exports.getAccessToken = function(cb) {
var tokenConf; //contains info such as port, host, url etc
var httpReq = shttp.request(tokenConf, function(res) {
res.setEncoding('utf8');
if (res.statusCode == 200) {
var body = "";
res.on('data', function (result) {
body += result;
});
res.on('end', function (){
cb(JSON.stringify({error: '', response: (body)}));
});
} else {
cb(JSON.stringify({error: 'Failed to get user access token '+res.statusCode, response:''}));
}
});
httpReq.on('error', function(e) {
cb(JSON.stringify({error: 'Failed to get user access token'+e, response:''}));
});
httpReq.end();
};
exports.testApi = function(userConf,accessToken,sjmCallback) {
var userConf; //contains info such as port, host, url etc
var httpSubmitReq = shttp.request(userConf, function(res) {
res.setEncoding('utf8');
if (res.statusCode == 200) {
var body = "";
res.on('data', function (result) {
body += result;
});
res.on('end', function () {
sjmCallback(body);
});
} else {
sjmCallback(JSON.stringify({"payLoad":null,"reasonCode":"fail","status":null}));
}
});
httpSubmitReq.on('error', function(e) {
sjmCallback(JSON.stringify({"payLoad":null,"reasonCode":"fail","status":null}));
});
httpSubmitReq.end();
};
我不明白这个问题。您是否在问,如果延迟20秒,为什么
testApi()
会做一些奇怪的事情?如果您问为什么getAccessToken()
会被多次调用,那么您必须向我们展示调用它的代码,因为这可能是问题所在。我注意到您似乎没有一种干净的方式从getAccessToken()
返回错误。在所有情况下,您都使用对象调用回调函数,但传入的函数会查找回调函数中的错误参数,而这种情况从未发生过。这并不能解释为什么任何东西都会被调用两次,但它确实意味着在代码中错误看起来与成功相同,但不太可能是正确的。具体来说,这一行if(accessToken)
将始终是true
@jfriend00,实际上我还没有在这里发布完整的代码。如果看到getAccesToken函数的响应,cb(JSON.stringify({error:'',response:(body)});我正在发送response:body,如果(accessToken){}类似这样的var-tokenInfo=JSON.parse(accessToken),我将在前面解析它;var accessToken=JSON.parse(accessToken.response);accessToken=accessToken.access\u令牌代码>好吧,如果你没有显示适当的代码,我们真的帮不了你,特别是如何调用东西(这可能就是你的问题所在)。@jfriend00,请现在检查。我也添加了route函数,它调用getAPI函数。我不明白这个问题。您是否在问,如果延迟20秒,为什么testApi()
会做一些奇怪的事情?如果您问为什么getAccessToken()
会被多次调用,那么您必须向我们展示调用它的代码,因为这可能是问题所在。我注意到您似乎没有一种干净的方式从getAccessToken()
返回错误。在所有情况下,您都使用对象调用回调函数,但传入的函数会查找回调函数中的错误参数,而这种情况从未发生过。这并不能解释为什么任何东西都会被调用两次,但它确实意味着在代码中错误看起来与成功相同,但不太可能是正确的。具体来说,这一行if(accessToken)
将始终是true
@jfriend00,实际上我还没有在这里发布完整的代码。如果看到getAccesToken函数的响应,cb(JSON.stringify({error:'',response:(body)});我正在发送response:body,如果(accessToken){}类似这样的var-tokenInfo=JSON.parse(accessToken),我将在前面解析它;var accessToken=JSON.parse(accessToken.response);accessToken=accessToken.access\u令牌代码>好吧,如果你没有显示适当的代码,我们真的帮不了你,特别是如何调用东西(这可能就是你的问题所在)。@jfriend00,请现在检查。我还添加了route函数,它调用getAPI函数
app.get('/testApi', function (req, res) {
var typeObj = {};
typeObj.apiType= 'testApi';
try {
getAPI(JSON.stringify(typeObj), req, res, function(response) {
res.end(response);
});
} catch(err) {
res.end(err);
}
});