Javascript nodejs异步函数未返回
我有一个功能。在这个函数中,我检查并验证一个令牌,向Facebook发送一个http请求,向我的云服务器发送另一个http请求Javascript nodejs异步函数未返回,javascript,node.js,Javascript,Node.js,我有一个功能。在这个函数中,我检查并验证一个令牌,向Facebook发送一个http请求,向我的云服务器发送另一个http请求 function myAsyncFunction(token,fbat){ if (token) { jwt.verify(token, jwt_secret, { issuer: 'me@me.com' }, function(err, decoded) { if (err) {
function myAsyncFunction(token,fbat){
if (token) {
jwt.verify(token, jwt_secret, {
issuer: 'me@me.com'
}, function(err, decoded) {
if (err) {
if (err.name === 'TokenExpiredError') {
console.log('Token expired'); // renew token
var options = {
hostname: 'graph.facebook.com',
port: 443,
//path: '/oauth/?appsecret_proof='+hash+'&access_token='+at,
path: '/v2.5/me?fields=id&access_token=' + fbat,
method: 'GET'
}; //end of options
var callback = function(response) {
var str = '';
//another chunk of data has been received, so append it to `str`
response.on('data', function(chunk) {response on;
str += chunk;
});
response.on('end', function() { //start of response end;
var json = JSON.parse(str);
if (json.hasOwnProperty('id')) {
var params = {
TableName: 'Users',
Key: {
'fid': {
'N': json.id.toString()
}
},
ConsistentRead: false,
ProjectionExpression: 'fid,st'
};
dynamodb.getItem(params, function(err, data) {
if (err) {
return false;
} else { //start of dynamodb else
if (isEmptyObject(data)) {
return false;
}
else {
if (data.Item.st.S === 't') {
return true;
} else {
return false;
}
}
}
});
}
else {
return false;
};
});
response.on('error', function() {
return false;
});
};
https.request(options, callback).end();
} else if (err.name === 'JsonWebTokenError') {
return false;
} else {
return false;
}
} else {
return true;
}
});
} else {
return false;
}
return false;
};
然后我尝试调用此函数:
myAsyncFunction(token, fbat, function(result){
if(result){
//do some network calls here
}
else{
//do some other network calls here
}
});
myAsyncFunction(token, fbat, function(err, result) {
if (err) {
// handle error... something has gone wrong...
}
// do something with the result...
});
当我调用我调试过的异步函数时,它正在调用Facebook和我的服务器,问题是它没有返回任何东西。它到达返回语句的点,但检查结果是真是假的条件从未执行。您的
myAsyncFunction
只接受两个参数:function myAsyncFunction(token,fbat){…}
。因此,调用时传入的回调永远无法执行。此外,异步函数中的各种return
语句也不会产生预期效果
我建议阅读node.js/javascript的回调风格
你最终想要的是这样的东西:
function myAsyncFunction(token, fbat, callback) {
someOtherasyncFunction(arg1, arg2, function(err, result) {
if (err) {
return callback(err); // propagate error
}
yetAnotherAsyncFunction(argA, argB, function(err, result2) {
if (err) {
return callback(err); // propagate error
}
// do something with result2...
callback(null, myResult); // result2 is the result being passed into the callback
});
});
}
现在,当您调用函数时:
myAsyncFunction(token, fbat, function(result){
if(result){
//do some network calls here
}
else{
//do some other network calls here
}
});
myAsyncFunction(token, fbat, function(err, result) {
if (err) {
// handle error... something has gone wrong...
}
// do something with the result...
});
谢谢,我没有意识到我需要像那样打回电话,现在效果很好!