/ / Czy Mongoose zapyta, czy `then` wywołanie występuje po zakończeniu każdego wywołania callback? - node.js, mangusta, obietnica, obietnica es6

Czy Mongoose zapyta, czy `then` wywołanie występuje po zakończeniu każdego wywołania callback? - node.js, mangusta, obietnica, obietnica es6

Zdaję sobie sprawę, że standardową praktyką obietnic w Mongoose jest użycie exec (), ale następujące prace (lub przynajmniej wydaje się) i chcę zrozumieć przepływ. Nie jestem przeciwny użyciu execPo prostu trochę tego się uczę.

W następującej operacji Mongoose:

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?

rozumiem doSomething() zostanie wywołany w pewnym momencie - nie ma problemu. Pytanie brzmi, czy pierwsze wywołanie zwrotne wywołania usuwania zostanie zakończone przed doSomethingElse w then połączenie jest wywoływane. Wydaje się, że w tym id jest poprawnie wypełniony doSomethingElse, ale chcę się upewnić, że to nie jest tylko odrobina wyczucia czasu - tzn. chcę wiedzieć, czy mogę liczyć na to, że callback zakończy się przed then. Używam standardowych obietnic ES6 (NodeJS.Global.Promise).

Alternatywą jest to, że może then jest wywoływana po zakończeniu operacji usuwania, ale przed zakończeniem oddzwaniania (nie wydaje się - ale chcę potwierdzić).

Postawcie mnie na prostym poziomie, jeśli nie rozumiem tego niepoprawnie.

Odpowiedzi:

1 dla odpowiedzi № 1

Tak, ponieważ @JaromandaX wyjaśnia w komentarzach kolejność wywołań zwrotnych jest deterministyczna.

Jednak nadal jest to zły kod i nie powinieneś polegać na tym zachowaniu. Jeśli używasz obietnic, nie prześlij oddzwonienia do remove w ogóle; przekazywać tylko wywołania zwrotne 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 zostanie wywołany z wynikiem poprzedniego wywołania zwrotnego, które jest gwarantowane do tego zostało ukończone.