承诺 - 在一个地方被视为承诺,并且未定义'在另一个

时间:2016-09-01 22:35:59

标签: angular promise angular-promise

我正在创建一个新的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);
        });

      });
  }
}

1 个答案:

答案 0 :(得分:0)

我会把它变成一个答案,因为它显然导致你弄清楚问题:

如果.catch()处理程序中的代码在它抛出异常之前,它也可以命中promise1.then()。你没有显示任何代码,所以我不知道是否会发生这种情况,但这是另一种方法.catch()

所有.then()处理程序都是所谓的“throw-safe”。这意味着如果.then()处理程序中的任何代码抛出异常,它将被promise的.then()处理代码自动捕获,然后拒绝承诺,异常作为拒绝的原因。因此,在抛出异常的.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