我有一个功能。在这个函数内部,我检查我验证一个令牌,向Facebook发送一个http请求,以及另一个http请求到我的云服务器。
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
}
});
当我调用异步函数时,我调试它并调用Facebook和我的服务器,问题是它没有返回任何内容。它会到达return语句,但检查结果是true还是false的条件永远不会被执行。
答案 0 :(得分:0)
您的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(err, result) {
if (err) {
// handle error... something has gone wrong...
}
// do something with the result...
});