【问题标题】:Promise - Getting read as promise in one place and as 'undefined' in another承诺 - 在一个地方被解读为承诺,在另一个地方被解读为“未定义”
【发布时间】:2017-01-09 22:45:19
【问题描述】:

我正在创建一个新的 Promise(类中唯一返回 Promise 的方法)

return new Promise(function(resolve, reject) { 
    ... mongo DB call
    if ( err ) {reject(err)}
    if ( data ) {resolve(data)}
})

当我返回这个时,我可以在一个地方把它当作一个承诺来阅读并使用

promise.then(..)

但是,当我尝试在另一个类中做同样的事情时(它在两个类的第一行),我收到一个错误,如下所示,

[TypeError: Cannot read property 'then' of undefined]

有没有人遇到过类似的问题?

编辑:按照建议,这是实际代码 -

module.exports = {
  populateDashboard: function ( req, callback ) {

    var userInfo = {userName: 'Business User1', role: 'business'};
    console.log ('userInfo - ', userInfo); // Getting this value, obviously!
    var promise1 = roleAccessRepository.getUserRoleAccess (userInfo.role);
    promise1.then (
        function(data) {

        }
    ).catch(
        function(err) {
            console.log('error', err); // Error getting caught here
        }
    )}
}



module.exports = {
    fetchCampaignInfo: this.fetchCampaignInfo,
}
    fetchCampaignInfo = function ( role, userName, sectionName, callback ) {

      var campaignList = [];
      var promiseArray = [];

      var promise1 = roleAccessRepository.getUserRoleAccess (role);
      promise1.then (
        onRoleSuccess = function ( data ) {
            // This goes through fine
        }
    ).catch(
        function(err) {
            console.log('error', err); 
        }
    )}
}

module.exports = {
  getUserRoleAccess: function ( role ) {
    return new Promise (
      function ( resolve, reject ) {
        var roleAccess = mongoose.model ('roleAccess', userAccessRole);
        roleAccess.find ({role: role}, function ( err, data ) {
          if ( err ) {
            console.log ('getUserRoleAccess - error', err);
            reject (err);
          }
          console.log ('getUserRoleAccess - Data', JSON.stringify(data));
          resolve (data);
        });

      });
  }
}

【问题讨论】:

  • 您的代码显然有问题。承诺不会像你描述的那样做。因此,我们可以帮助您的唯一方法是让您向我们展示有问题的代码。这可能是您如何使用返回的承诺的问题。并且,请向我们展示真实代码,而不是编辑或伪代码(就像您现在的答案一样)。问题是您的实际代码中的一个细节,因此我们可以准确帮助您的唯一方法是查看实际代码的相关部分。
  • 由于您在这里可能有点新手,这个网站是关于解决实际代码中的问题。我们在没有显示相关代码的理论问题上做得非常糟糕。这需要我们提出很多问题和猜测,这既是超级低效的,而且往往只是试图找到答案的一种无效方式。但是,如果您向我们展示您的实际代码,我们通常可以提供一个相当快速且非常具体的答案来准确解决问题。
  • 就像你说的,我是 Angular 和 StackOverflow 的新手。而且我还觉得这可能是一个很容易让人联想到的常见问题。反正我已经更新了上面的代码。
  • 第一次写问题的时候一定要把相关代码贴在这里。您能否更具体地说明您的代码中有问题的确切位置?仅供参考,在调用reject(err) 之后,您应该从回调中return 或在if 上使用else,这样后面的其他代码就不会运行。这不是您的问题的原因,但它肯定会让您感到困惑。
  • 此行是无效代码:fetchCampaignInfo = function (role, userName, sectionName, callback) { 它位于对象定义中的位置。您是否在问题的副本中弄乱了一些东西?或者这是您代码中的实际语法错误?

标签: angular promise angular-promise


【解决方案1】:

我会把它变成一个答案,因为它显然会让你找出问题所在:

如果promise1.then() 处理程序中的代码恰好在它引发异常之前,它也可能命中.catch()。你没有显示任何代码,所以我不知道这是否正在发生,但这是点击 .catch() 的另一种方式。

所有.then() 处理程序都是所谓的“抛出安全”。这意味着如果.then() 处理程序中的任何代码抛出异常,它会被promise 的.then() 处理代码自动捕获,然后该promise 会以异常作为拒绝的原因被拒绝。因此,在引发异常的 .then() 处理程序之后的任何链接处理程序都将看到被拒绝的承诺。这意味着从promise1.then() 返回的承诺被拒绝,因此promise1.then().catch() 将命中.catch() 处理程序。

这里有一个简单的例子来说明:

function delay(t) {
    return new Promise(function(resolve) {
        setTimeout(resolve, t);
    });
}

delay(100).then(function() {
    console.log("#1");
    throw new Error("some error");
}).then(function() {
    console.log("#2");
}).catch(function(err) {
    console.log("#3 ", err.message);
});

这将显示输出:

#1
#3  some error

【讨论】:

  • @RamanaSarva - 由于您可能是新来的,我想解释一下,如果您的问题现在得到解答,那么您可以通过单击左侧的绿色复选标记向社区表明这一点的最佳答案,这也将为您在此处获得一些声誉积分,以遵循正确的程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多