我从Promise返回的结果是<pending>

时间:2016-11-20 14:18:56

标签: javascript node.js

我使用Sequelize数据库orm并使用此代码

model.create(
    {
        username: 'John'
    } ).then( function (result) {
    return result.userUniqueId;
} );

我可以在数据库中创建新用户,我可以在userUniqueId内打印then()

创建用户之后我想在其他功能中使用返回的userUniqueId或仅在控制台上打印,但我无法从中返回result.userUniqueId,以解决此问题。我试图使用Promise获得结果然后我将其部署到:

'use strict';

module.exports = {
    createNewUser: function (model) {
        return new Promise(
            function (resolve, reject) {
                model.create(
                    {
                        username: 'John'
                    } ).then( function (result) {
                    return result.userUniqueId;
                } );
            } )
            .then( function (result) {
                resolve( result.userUniqueId );
            } );
    },
};

但是我在createNewUser函数之外得到了console.log( controller.createNewUser( models.users ) );

的结果

结果:

Promise { <pending> }

我该如何解决这个问题?

更新:

'use strict';

module.exports = {
    createNewUser: function (model) {
        return new Promise((resolve, reject) => {
            return model.create(
                {
                    username: 'John'
                })
                .then(function (result) {
                    return result.userUniqueId;
                })
                .then(value => resolve(value));
        });
    },
};

var userId = controller.createNewUser(models.users)
        .then(function (userId) {
            return userId;
        });

console.log(userId);

打印承诺对象

2 个答案:

答案 0 :(得分:0)

这不是问题。除了已创建的已解决或拒绝的承诺(分别直接使用Promise.resolve()Promise.reject()),所有承诺都在&#34; pending&#34;中创建。状态。

当调用Promise的resolve()函数时,该状态将发生变化。

顺便说一下,你陷入了Promise构造函数反模式。而不是:

return new Promise((resolve, reject) => {
  doSomething()
    .then(value => resolve(value));
});

只做

return doSomething()

无需使用其他Promise构造函数包装Promises。

答案 1 :(得分:0)

与任何承诺一样,您需要使用then来访问其结果值:

controller.createNewUser( models.users )
    .then(function (userId) {
         // do something with the ID
    });

您无法直接访问承诺中的值,因为承诺可能尚未解决。

正如马达拉指出的那样,你已经陷入了明确的承诺建构反模式。摆脱无关的代码:

module.exports = {
    createNewUser: function (model) {
         return model.create(
             {
                 username: 'John'
             } )
             .then( function (result) {
                 return result.userUniqueId;
             } );
    },
};