【问题标题】:BlueBird Promises returns "Undefined" when return inside "then" functionBlueBird Promises 在“then”函数内返回时返回“Undefined”
【发布时间】:2016-05-21 22:06:38
【问题描述】:

这是我的代码:

检查用户是否关注官方 Twitter 帐户(这里我返回了新的 Promise

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 函数在 then 函数中返回 result 变量。

更新: 在调试时,我知道了,console.log(response) 在 验证函数在抛出未定义后稍后显示 "then" 函数,表示程序无法得到响应 由于异步性质,I/O 不会立即被阻塞。如何 解决这个问题?

【问题讨论】:

    标签: node.js promise


    【解决方案1】:

    您实际上并没有在 validateMsg 函数中返回任何内容。您在 .then 函数中返回一个同步值 ( result ),这是一个单独的函数。

    要考虑的第二件事是您期望 validateMsg 函数,它是异步的,可以同步运行。

    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(dm).then( function( result ){
          console.log( result );
        })
        .catch( function( err ){
          console.log( "Err:::", err );
        });
    

    【讨论】:

    • 看起来很有趣。我想我通过提供我所有的代码让你感到困惑。让我修改一下我的问题并回复你:) 非常感谢你的帮助!
    • 不需要!!你的决心像魅力一样工作!我刚刚在 validateMsg 函数中返回了另一个承诺。谢谢你的努力哥们!!!
    • :) 我建议阅读一些有关承诺模式的内容。我推荐这篇文章@nolanlawson pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html
    • 是的,谢谢!虽然从 PHP 切换是一件容易的事,但我还是 NodeJS 的新手!
    【解决方案2】:

    validationMsg 函数没有返回值,因此 main 函数中的结果具有 undefined 值。尝试将 return 放在 isFollowing 前面,以便函数返回一个承诺,然后将 validationMsg 视为一个承诺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-05
      • 1970-01-01
      • 2015-06-15
      • 2018-07-09
      • 2019-11-03
      相关资源
      最近更新 更多