这是我的代码:
检查用户是否正在使用官方Twitter帐户(此处我已经返回新的承诺
var isFollowing = function(sender) {
return new promise(function(resolve, reject) {
var following = false;
var params = {
source_id: sender,
target_screen_name: config.get('twitter.official_account')
};
TwitObj.get('friendships/show', params, function(err, data) {
if (!err) {
following = data.relationship.source.following;
resolve(following);
} else {
reject(err);
}
});
});
};
验证
var validateMsg = function(dm) {
var sender = getSender(dm);
var result = [];
isFollowing(sender.id)
.then(function(response) {
if (!response) {
result = interactiveMessage(false, lang.__('FOLLOW_MAIN', sender.name));
console.log(result); // Displays as expected
return result; // Not returning value Do I need to return promise again? If yes, WHY?
}
});
};
主要实施:
var direct_message = function(msg) {
verifyAccount().catch(function(err) {
console.error(err);
});
var dm = msg.direct_message;
var result = validateMsg(dm);
console.log(result);
};
问题是如何强制validateMsg函数在result
函数内返回then
变量。
更新:在调试时,我知道了
console.log(response)
抛出undefined后,验证函数显示在后面 "然后"功能,这意味着程序无法得到响应 由于异步性质,I / O不会被阻止。怎么样 解决这个问题?
答案 0 :(得分:3)
您实际上没有在validateMsg函数中返回任何内容。您在result
函数中返回同步值(.then
),这是一个单独的函数。
要考虑的第二件事是你期待validateMsg函数,它是异步的,可以同步运行。
var result = validateMsg(dm);
实现我相信你所做的事情的方法包括做出以下改变: 1)返回validateMsg函数中的promise链。
var validateMsg = function(dm) {
var sender = getSender(dm);
var result = [];
return isFollowing(sender.id)
.then(function(response) {
if (!response) {
result = interactiveMessage(false, lang.__('FOLLOW_MAIN', sender.name));
return result;
}
// Not sure what you want to do here if there is a response!
// At the moment you're not doing anything if the validation
// is successful!
return response;
});
};
2)更改您的函数调用,因为您现在正在返回一个承诺。
validateMsg(dm).then( function( result ){
console.log( result );
})
3)考虑在某处添加一个catch只是为了帮助你调试:)
validateMsg(dm).then( function( result ){
console.log( result );
})
.catch( function( err ){
console.log( "Err:::", err );
});
答案 1 :(得分:0)
validationMsg函数没有返回值,因此main函数中的结果具有undefined值。尝试将返回放在isFollowing前面,以便函数返回一个promise,然后将validationMsg视为一个promise。