Вы можете добавить флаг для контроля, если обновление дерева продолжается:
var fixTreeInProgress = false;
module.exports = {
identity: 'Role',
attributes: {
//..
},
afterCreate: function(rec, cb) {
if (!fixTreeInProgress) {
fixTree();
}
cb();
},
afterUpdate: function(rec, cb) {
if (!fixTreeInProgress) {
fixTree();
}
cb();
},
}
function fixTree() {
/* code here */
fixTreeInProgress = true;
//passing callback to clear out flag when update is complete
Role.update(criteria, updatedRecords, function fixTreeUpdateCallback() {
fixTreeInProgress = false;
}); // <--- do not trigger afterUpdate
/* and code here */
}
Но имейте в виду: если данные будут обновлены в другом запросе при Role.update находится в стадии разработки , это сделает вашу несогласованные данные:
Рассмотрим такой сценарий:
- Приложение получает запрос на обновление данных.
- обновляет данные контроллера, жизненный цикл обратного вызова вызывается
fixTreeInProgress
ВДП false
, поэтому мы запускаем fixTree()
и установите fixTreeInProgress
в true
- App получает еще один запрос на обновление данных.
- контроллер обновляет данные, жизненный цикл обратного вызова вызывается,
fixTreeInProgress
ВДП true
, поэтому мы сделать не запуск fixTree()
- Role.update() завершена,
fixTreeInProgress
набор для false
В этом случае у нас будет дерево, обновленное старой версией данных.
Чтобы справиться с такими ситуациями, вам необходимо использовать какую-то очередь задач (и, необязательно, какую-то функцию дебютации).
Хороший вопрос. Указывает на того, кто получает этот. Я думаю, что это должен быть запрос функции, чтобы иметь возможность игнорировать обратные вызовы. – Meeker