【问题标题】:Nesting promises with mongoose用猫鼬嵌套承诺
【发布时间】:2014-03-27 05:47:06
【问题描述】:

我有一个承诺,我将使用 mongoose 进行数据库操作。使用 mpromise 库,我正在使用 teamMatch 并使用它来更新 Team 文档。但是,在我更新 Team 的那一行(以 var getTeamPromise 开头)之后,该程序不会做任何事情。

如何更改此代码以便更轻松地执行上述操作?

saveTeamMatch.then(

    function saveTeamMatchToTeam(teamMatch) {

        console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works

        // when a team is gotten and a teamMatch is made and saved
        // save the teamMatch to the team
        var getTeamPromise = Team.findOneAndUpdate( { id:1540 }, { $push:{ matches:teamMatch } } ).exec()

        .then(

            function successfullySaveTeamMatchToTeam(team) {
                console.log('TEAM in SUCCESSFUL SAVE', team);
                getTeamPromise.resolve();
            },

            function failToUpdateTeam(err) {
                console.error( err );
                getTeamPromise.resolve();
            }

        )

        .resolve(
            function endFindMatchPromise() {
                saveTeamMatch.end();
            }
        );
    },

    function failToSaveTeamMatch(err) {
        console.error(err);
        saveTeamMatch.end();
    }

);

【问题讨论】:

  • .resolve() 应该做什么?

标签: node.js mongodb mongoose promise


【解决方案1】:

看来你对 Promise 有一些误解:

给定getTeamPromise.then(onResolve, onReject)

  • 在 onResolve 和 onReject 中,promise 已被解析/拒绝,因此您无法通过在同一个 promise 上调用 resolve 来更改其状态
  • 你的 resolve(function()) 应该是第一个 then 的结果的处理结果
  • 通常您不应操纵 Promise 的状态,您调用的许多方法都是用于创建和履行 Promise 的内部方法。
  • 从 onResolve 处理程序返回一个承诺会将该承诺或值通过管道传递到下一个 then

让我以一种——可能——可行的方式写出来:

saveTeamMatch.then(function saveTeamMatchToTeam(teamMatch) {
    console.log('TEAM_MATCH in SAVE to TEAM', teamMatch); //works
    // when a team is gotten and a teamMatch is made and saved
    // save the teamMatch to the team
    return Team
        .findOneAndUpdate({id:1540}, {$push:{matches:teamMatch}}).exec()
        .then(function successfullySaveTeamMatchToTeam(team) {
            console.log('TEAM in SUCCESSFUL SAVE', team);
            return team;
        }, function failToUpdateTeam(err) {
            console.error('failedToUpdateTeam', err);
        });
},function failToSaveTeamMatch(err) {
    console.error('saveTeamMatch failed', err);
})
.end();

【讨论】:

    猜你喜欢
    • 2014-09-16
    • 2015-05-12
    • 1970-01-01
    • 2012-12-14
    • 2017-06-15
    • 2019-06-04
    • 2017-08-18
    • 2018-02-15
    • 2019-09-19
    相关资源
    最近更新 更多