环回API和承诺

时间:2016-07-26 08:52:03

标签: javascript node.js promise loopback

在环回文档中,它说 "以下内置模型支持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。

1 个答案:

答案 0 :(得分:1)

两个问题:

  1. 您的承诺代码与非承诺代码的功能不同。在您的非承诺代码中,在aUser.login成功完成之前,您不会执行“填充”,但在您的承诺代码中,您不会等待它。要做同样的事情,您的第一个then回调需要返回 aUser.login返回的承诺。否则,您首次致电then的承诺将使用值undefined解决,而不是根据aUser.login承诺的解决或拒绝而解决。

  2. 您为then回调声明的参数不正确:解析回调会收到单个参数,这是已解析的值。它不像NodeJS回调那样接收两个。

  3. 所以(参见标有***的行):

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