2017-01-19 7 views
0

私は、Mongooseの約束のための標準的な習慣はexec()を使用することであることを認識していますが、以下の作業(または少なくとも現れます)があります。私はexecを使用することに反対ではない、私はちょうどこれを学ぶために少しを探っています。次マングース動作でMongooseは、コールバックで渡されたコールが完了した後に `then`コールを実行しますか?

let id:string; 

SomeDocument.remove({}, (err) => { //clears collection 
    someDoc = new SomeDocument(data); //creates a new doc for the collection. Id is created here from what I understand. 
    someDoc.save((err, result) => { doSomething(); });//doSomething gets called sometime in the future. 
    id = someDoc._id.toString(); 
}).then((result) => {doSomethingElse(id)});//This works - but will doSomethingElse always be called after the first annonymous callback completes? 

私はdoSomething()はいくつかの将来の時点で呼び出されますことを取得しない - 何の問題。問題は、thenコールのdoSomethingElseが呼び出される前に、削除コールの最初のコールバックが完了するかどうかです。 idにはdoSomethingElseが正しく入力されているようですが、タイミングのばかつきではないことを確認したいと思います。つまり、thenより前に完了したコールバックに頼ることができますか?私は標準ES6の約束事(NodeJS.Global.Promise)を使用しています。

代わりに、削除操作が完了した後で、コールバックが完了する前に(おそらく - 確認したいが)、thenが呼び出される可能性があります。

私がこれを間違って説明している場合はまっすぐに設定してください。

+0

よく、そのコールバックを保存するので、 'id = someDoc._id.toString()'行が実行された後で実際に完了する保存操作が完了した後に呼び出されます。 – WillyC

+0

申し訳ありません - それはポストの単なるエラーでした。 doSomethingElseはanon関数の中から呼び出されています。 私は実際にこれを実行すると、 'doSomethingElse(id)'の前に 'id = someDoc._id.toString()'という行が呼び出されているので、idが正しくdoSomethingに代入されていることがわかります。だから少なくとも、コールバックを取り除いた後に実行される可能性があります。これは確実に起こるかどうかです(私の場合はそうですが、それはちょっとばかりかもしれません)。 – WillyC

+0

母 - はい、そうです。私はちょうど私の実際のコードを掲示するべきだったが、それはちょっと乱雑だった。明らかにそれを「単純化」しようとしているとき、私はそれを実質的にねじ込みました。私はそれを修正した。ありがとう!しかし、最終的には、関数を 'then'と呼ぶ操作にコールバックとして渡した後に、' then'関数が常に実行されるようになります。特に - 最初に実行される - コールバックまたは 'then'? – WillyC

答えて

1

はい、@ JaromandaXはコメントに説明されているように、コールバックの順序は決定的です。

しかし、それでもコードは悪いので、この動作に頼るべきではありません。約束を使用している場合は、コールバックをremoveに一切渡さないでください。 thenにコールバックを渡すだけです!

SomeDocument.remove({}) 
.then(() => { 
    const someDoc = new SomeDocument(data); 
    someDoc.save().then(doSomething); // doSomething will get called in the future. 
    return someDoc._id.toString(); 
//^^^^^^ 
}) 
.then(doSomethingElse); // doSomethingElse will get passed the id 

doSomethingElseそのために完了したとを保証されている以前のコールバックの結果と呼ばれます。

+0

合意 - 実際にはそうしたことを行うためにリファクタリングしていますが、また、私はちょうど確かに知りたかった - 今私はコールバックの順序が有用である決定的であることを知っている! – WillyC

関連する問題