Node.js “蓝鸟承诺回报”;“未定义”;“何时返回内部”;然后";功能
这是我的密码: 检查用户是否拥有官方推特账户(这里我返回了新承诺)Node.js “蓝鸟承诺回报”;“未定义”;“何时返回内部”;然后";功能,node.js,promise,Node.js,Promise,这是我的密码: 检查用户是否拥有官方推特账户(这里我返回了新承诺) var isFollowing = function(sender) { return new promise(function(resolve, reject) { var following = false; var params = { source_id: sender, target_screen_name: config.get(
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);
};
主要实现:
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函数返回函数中的结果变量然后函数
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;
});
更新:调试时,我知道,console.log(response)
in
验证函数稍后在抛出undefined后显示
“then”函数,表示程序无法获得响应
由于异步特性,I/O不会立即被阻止。如何阻止
解决这个问题
validationMsg函数没有返回值,因此主函数中的结果具有未定义的值。请尝试将return放在isFollowing前面,以便函数返回承诺,然后将validationMsg视为承诺。validationMsg函数中实际上没有返回任何内容。您返回的是同步值(结果
)在中。然后
函数,它是一个单独的函数
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;
});
validateMsg(dm).then( function( result ){
console.log( result );
})
要考虑的第二件事是,您期望的是ValueTimeSG函数,它异步地同步地运行。
var result=validateMsg(dm);
实现我认为您希望实现的目标的方法包括进行以下更改:
1) 在validateMsg函数中返回承诺链
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函数中返回了另一个承诺。谢谢你的努力,伙计!!!:)我建议读一些关于承诺模式的书。我推荐@nolanlawson的这篇文章是的,谢谢!我对NodeJS有点陌生,虽然从PHP切换是一件容易的事情!