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切换是一件容易的事情!