在环回文档中,它说 "以下内置模型支持promises API: 用户 应用 PersistedModel"
因此,如果在单元测试中,我想创建一个用户,然后记录该用户,那么如何使用回调方法:
aUser.create({email: 'user3@bar.com', password: 'foo'}, function() {
aUser.login({email: 'user3@bar.com', password: 'foo'}, 'user', function (err, res) {
// stuff
});
});
但使用承诺并不是:
var Promise = require ('bluebird');
aUser.create({email: 'foo@bar.com', password: 'bar'})
.then(function(err, res){
aUser.login({email: 'foo@bar.com', password: 'bar'}, 'user');
})
.then(function(err, res) {
//stuff
})
.catch(function(err){
console.error(err);
});
我也尝试过Promise.join,Promise.mapSeries。
答案 0 :(得分:1)
两个问题:
您的承诺代码与非承诺代码的功能不同。在您的非承诺代码中,在aUser.login
成功完成之前,您不会执行“填充”,但在您的承诺代码中,您不会等待它。要做同样的事情,您的第一个then
回调需要返回 aUser.login
返回的承诺。否则,您首次致电then
的承诺将使用值undefined
解决,而不是根据aUser.login
承诺的解决或拒绝而解决。
您为then
回调声明的参数不正确:解析回调会收到单个参数,这是已解析的值。它不像NodeJS回调那样接收两个。
所以(参见标有***
的行):
var Promise = require ('bluebird');
aUser.create({email: 'foo@bar.com', password: 'bar'})
.then(function(res){ // ***
return aUser.login({email: 'foo@bar.com', password: 'bar'}, 'user'); // ***
})
.then(function(res){ // ***
//stuff
})
.catch(function(err){
console.error(err);
});
附注:如果您未在代码中使用Promise
,则无需要求它。