BlueBird Promises返回" Undefined"在内部返回"然后"功能

时间:2016-05-21 10:48:26

标签: node.js promise

这是我的代码:

检查用户是否正在使用官方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不会被阻止。怎么样   解决这个问题?

2 个答案:

答案 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。