环回 API 和承诺

Loopback APIs and 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
                });
            });

但使用 promise 不会:

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。

两个问题:

  1. 您的 promises 代码与您的 non-promises 代码做的事情不同。在您的非承诺代码中,您不会执行 "stuff" 直到 aUser.login 成功完成,但在您的承诺代码中您不会等待它。为了做同样的事情,您的第一个 then 回调需要 return aUser.login return 的承诺。否则,您第一次调用 then returns 的承诺将使用值 undefined 解决,而不是根据 aUser.login 承诺的解决或拒绝来解决。

  2. 您为 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,则无需要求它。