Nodejs从Promis返回结果并将变量异步赋值为函数

时间:2016-11-20 18:33:17

标签: javascript node.js

我的下面的代码工作正常,我可以用数据库创建一些数据,但之后我需要从中获取最新插入的id以用于代码的其他地方,但是这个函数导出了返回promise对象,我可以& #39; t将变量指定为函数结果,例如:

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));
        });
    },
};

返回Promise对象,我不能将带有返回结果的变量指定为

return result.userUniqueId;

我希望得到结果并使用以下代码打印或指定变量作为结果:

console.log( controller.createNewUser( models.users ) );

2 个答案:

答案 0 :(得分:1)

是的,使用协同程序和yield你实际上可以暂停方法的执行并将co函数返回给调用者,并且调用者可以通过使用带有传递给分数的参数的co函数对象来恢复执行例程 - 但是例程没有办法将半生不熟的数据传回调用者,也没有办法在这个上下文中有意义:在你的代码中,直到你生成用户的唯一ID,没有什么可以返回调用者,唯一ID生成是异步的,并且在执行所有回调之前不会结束。简而言之,协程用例不适用于此处。希望这澄清。

答案 1 :(得分:0)

解析promise语义:

  • 这只是一种语义美化两个或多个异步调用。
  • 从链中的任何地方返回既无效也无意义。
  • 正如@Bergi指出的那样,从部分执行的异步调用返回会破坏promise链。确切地说,当涉及Promise时,通过返回值绑定的调用者 - 被调用者关系不会使得成为有效的语义。
  • 出路#1:创建并向调用者返回promise和事务,然后管理调用者中的其余链(丑陋)。

  • 出路#2:将promise视为旧异步调用链的语义包装器,并在promise链的叶子中处理结果处理(推荐)。

  • 底线:调用者在调用中没有任何赌注,被调用者参与异步调用。

希望这有帮助。