2017-11-20 3 views
0

これが今のように私の前のフックです:MongoDB/mongoose - mongoose内で複数の操作を行っているときに次の呼び出しを処理する方法

OrganisationSchema.pre('remove', function(next) { 

    Account.update({'organisations._id': this._id}, {$pull: {'organisations._id': this._id}}, {multi: true}, (err) => { 

    if (err) { 
     return next(err); 
    } 

    Invite.remove({organisation: this._id}, (err) => { 

     if (err) { 
     return next(err); 
     } 

     next(); 
    }); 
    }); 
}); 

Invite文書が存在しない場合、その後nextが呼び出されることはありませんので、これは明らかに動作しません。

は、好ましくは、私が希望するもののようなものです:

OrganisationSchema.pre('remove', function(next) { 

    Account.update({'organisations._id': this._id}, {$pull: {'organisations._id': this._id}}, {multi: true}, next); 
    Invite.remove({organisation: this._id}, next); 
}); 

しかし、この解決策はおそらく、アプリのクラッシュを引き起こし、二回next解雇でしょう。

nextを呼び出す前に、複数の操作が完了するのを待つ優雅な方法がありますか?私が考えていた解決策の1つは、完成した操作の数を確認してから操作の総数を確認することですが、もっと良い方法が必要だと感じています。

答えて

1

最初の例は、 Inviteのドキュメントがない場合でも、コールバックは常に呼び出されます。

しかし、1つの解決策は、マングースがそれらをサポートしているので、約束を使用することです:

OrganisationSchema.pre('remove', function(next) { 
    Promise.all([ 
    Account.update({'organisations._id': this._id}, {$pull: {'organisations._id': this._id}}, {multi: true}).exec(), 
    Invite.remove({organisation: this._id}).exec() 
    ]) 
    .then(next) 
    .catch(next) 
}); 
関連する問題