2016-04-24 205 views
6

我有一個類中我用下面的代碼的NodeJS應用:承諾正在等待

var mongoose = require('mongoose'); 
var Roles  = mongoose.model('roles'); 
var Promise  = require("bluebird"); 

module.exports = Role; 

var err = null; 
var id; 

function Role(name, companyId) { 
    this.err = err; 
    this.name = name; 
    this.companyId = companyId; 
    this.id = getId(name, companyId); 
} 



var getId = function (name, companyId) { 
    return new Promise(function(resolve, reject) { 
     Roles.findOne({companyId:companyId, name:name}, function(err,result) { 
       resolve(result._id); 
     }); 
    }); 
}; 

當我調用類中,ID正在等待:

var currentRole = new Role(myRole, comId); 
console.log(currentRole); 

我如何獲得解決這個問題時的價值觀?

+0

當出現'err'時,應該'拒絕'。 – Bergi

+0

看看[是不是很好的做法,有一個構造函數返回一個Promise?](http://stackoverflow.com/q/24398699/1048572) - 你可能不想做'currentRole.id.then (...)' – Bergi

回答

3

currentRole.id是一個承諾,所以你可以調用它的then()等待它需要解決:

var currentRole = new Role(myRole, comId); 
currentRole.id.then(function (result) { 

    // do something with result 
}); 

這感覺就像一個奇怪的API,雖然,你希望你的對象是「準備使用」的時候其構造函數返回。也許是最好有getId上的Role原型返回函數,所以你而不是像做一個承諾:

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}); 

你也應該考慮處理該錯誤拒絕承諾:

var getId = function (name, companyId) { 
    return new Promise(function(resolve, reject) { 
     Roles.findOne({companyId:companyId, name:name}, function(err,result) { 

       if (err) { 
        return reject(err); 
       } 
       resolve(result._id); 
     }); 
    }); 
}; 

和添加拒絕處理您的來電getId

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}, function (err) { 

    // do something with err 
}); 

或等價:

var currentRole = new Role(myRole, comId); 
currentRole.getId().then(function (result) { 

    // do something with result 
}).catch(function (err) { 

    // do something with err 
}); 
+0

謝謝你馬特! 我用你最後的建議,現在的代碼工作,看起來更乾淨。 –