【问题标题】:Loopback APIs and promises环回 API 和承诺
【发布时间】:2016-07-26 17:04:16
【问题描述】:

在环回文档中,它说 “以下内置模型支持 Promise API: 用户 应用 持久模型”

所以如果在单元测试中,我想创建一个用户,然后登录该用户,那么使用回调方法是如何工作的:

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。

【问题讨论】:

  • “不起作用”怎么办?

标签: javascript node.js promise loopback


【解决方案1】:

两个问题:

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

  2. 您为 then 回调声明的参数不正确:解析回调接收 single 参数,这是解析后的值。它不像 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,则不需要它。

【讨论】:

  • 感谢您的回复 - 抱歉,Promise 示例中关于论点的几个拼写错误,但我感谢您的反馈
  • @stephenwil:不用担心。上面的第一项可能是错的。
猜你喜欢
  • 2023-03-26
  • 1970-01-01
  • 2016-06-15
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2017-12-18
  • 2014-03-11
相关资源
最近更新 更多