2017-01-07 1 views
0

Скажем, у меня есть мангуста документ a, который выглядит как:Сохраняет ли мангуста локальные изменения в документе после возврата из save()?

{field_1: 0, field_2: 0} 

Затем я пишу:

a.field_1 = 1; 
a.save() 

и спустя некоторое время, прежде чем операция сохранения фактически завершена, мы имеем:

a.field_2 = 1: 
a.save() 

Сохраняется ли изменение, которое я сделал до field_2? Я надеюсь, что возвращаемый документ a, после того, как спас, выглядит следующим образом:

{field_1: 1, field_2: 1} 

Я попробовал его на моей машине, и я получаю результаты, которые я хочу. Но я боюсь, что это может быть просто повезло, и что я мог бы (маловероятно) получим:

{field_1: 1, field_2: 0} 

В связи с тем, что возвращаемый документ из первоначального Спасите переписывает свою ценность field_2 в ноль перед вызовом второй сохранить.

Может ли кто-нибудь подтвердить, что второй случай невозможен, и, возможно, пролить свет на то, как с этим связано мангуст?

Спасибо!

ответ

1

и, возможно, пролить свет на то, как сделка с этим мангустом?

Как Mongoose сделки с .save() внутренне не объясняется в docs. Но, взглянув на source code, кажется, что тот же объект используется до некоторой точки (до того, как выполняется вызов собственного драйвера MongoDB), поскольку объекты Javascript передаются как ссылка, возможно, первый вызов будет использовать обновленный объект.

Но мы говорим здесь об асинхронных операциях, как только информация отправляется в MongoDB, мы не знаем, что произойдет, пока мы не получим ответ. Я думаю, что мы никогда не должны полагаться на такие асинхронные операции, как это, вы всегда должны ждать обратного вызова после завершения .save(), а затем сделать второй.

Может кто-нибудь подтвердить, что второй случай не представляется возможным

Так, отвечая на вопрос, я думаю, что второй случай может быть. Возможно, по какой-то причине первый вызов MongoDB (до обновления объекта) завершается после второго вызова.

На вашей локальной машине обычно это делается в том порядке, в котором вы его назвали. Но в зависимости от среды он не может быть выполнен в одном порядке, для этого есть много причин.