【问题标题】:How to return two Objects in a Promise using Sails?如何使用 Sails 在 Promise 中返回两个对象?
【发布时间】:2016-01-06 20:18:35
【问题描述】:

我正在使用 SailsJs v0.11.3,我想使用 Promises 来避免使用嵌套回调,但我不知道如何将两个对象从一个阶段 (.then()) 返回到另一个阶段一个。

我的代码看起来像这样,但是当我尝试在第三个 .then 语句上打印 start 参数时出现未定义。

User.findOneById(userId)
.then(function (result) { // #1
    return result;
}).then( function (result_a) { // #2
    console.log('---------------- ' +  result_a );

    var result_b = User.findOneById(ownerId)
        .then(function (result) {
            console.log(result);
            return result;
        });

    return [result_a, result_b];
}).then( function (start, finish) { // #3
    console.log('***********************', start, finish);
    // do something when is done
}).catch( function (err) {
    // do something when is error
    console.log(err);
    res.json(err.status,
    {
        error: err
    });
})
.done(function () {
    res.json(200);
});

控制台结果:

---------------- [object Object]
*********************** [ { person_id: '567ab10de51dcf11001b066a',
    email: 'jvilas1993@gmail.com',
    permission_level: 3,
    reset_password_token: null,
    belongs_to: '0',
    signin_count: 3,
    status_active: true,
    last_signin_at: '2016-01-05T17:55:49.595Z',
    last_signin_ip: '0.0.0.0',
    encrypted_password: '$2a$10$tDSUsXm7nn2p4r8FczpCrubbTig/7hJmy3W5u5hrcmMHAiVBXYZ/C',
    id: '567ab10de51dcf11001b0669' },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _progressHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined,
    _settledValue: undefined } ] undefined
{ person_id: '565f57b7cd451a110063eef9',
  email: 'rswomar@gmail.com',
  permission_level: 1,
  reset_password_token: '353635663537623763643435316131313030363365656638',
  belongs_to: '0',
  signin_count: 1,
  status_active: false,
  last_signin_at: '2015-12-02T20:42:30.434Z',
  last_signin_ip: '0.0.0.0',
  encrypted_password: '$2a$10$37EHaE6oED65gFHqh9sE0OBOTeD.txl8DTNYLxJwgws6NIwNQ73Ky',
  id: '565f57b7cd451a110063eef8' }

所以,我想知道如何将第二个.then 中的两个对象或变量返回到第三个​​@987654327 @。我的意思是第一个查询的结果和第二个查询的另一个结果,并在第三个​​.then

我希望以正确的方式解释我的问题。 提前致谢!

【问题讨论】:

    标签: javascript node.js promise sails.js waterline


    【解决方案1】:

    使用 bluebird 的 Promise.join()Promise.spread() 方法

      User.findOneById(userId)
        .then(function (result) { // #1
            return result;
        }).then( function (result_a) { // #2
            console.log('---------------- ' +  result_a );
    
            var result_b = User.findOneById(ownerId)
                .then(function (result) {
                    console.log(result);
                    return result;
                });
    
            return Promise.all([result_a, result_b]);
        }).spread( function (start, finish) { // #3
            console.log('***********************', start, finish);
            // do something when is done
        }).catch( function (err) {
            // do something when is error
            console.log(err);
            res.json(err.status,
            {
                error: err
            });
        })
        .done(function () {
            res.json(200);
        });
    

    【讨论】:

    • Jajaja 我只改变了#3 .then 的行,看起来像这样:.spread(function (start, finish) { // #3。只需将.then 更改为.spread 即可。非常感谢!
    • 不推荐使用.join - 要么使用.all,要么使用第三个函数作为参数。
    • @BenjaminGruenbaum 是正确的,现在不推荐使用没有第三个函数作为参数的 .join。我会更新我的答案
    • @Lexynux 如果这解决了您的问题,请将其标记为答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2019-06-30
    • 2016-04-10
    • 2017-08-01
    • 1970-01-01
    • 2022-07-08
    • 2015-02-26
    相关资源
    最近更新 更多