Nano Hash - криптовалюты, майнинг, программирование

Как использовать собственное обещание мангуста (mpromise) для удаления документа и последующего обновления другого документа

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

exports.destroy = function(req, res) {
  var actionID = req.body.id;

  var promise = Action.findById(actionID).exec();
  promise.then(function (action) {
    return Action.remove({'_id': action.id}).exec();
  }).then(function (count, action, something) {
    debugger;
  });
};

Моя схема действия документа содержит массив ObjectID, ссылающихся на дочерние действия:

var ActionSchema = new Schema({
  title: String, // Text to be shown when creating new action
  description: String, // Description if any
  children: { type: [Schema.Types.ObjectId], default: [] }, // JSON.stringified list of children
  nest_level: Number, // how nested we are for children level
});

Что я пытаюсь сделать, так это удалить документ действия, когда это будет сделано и успешно, найдите все документы действий, связанные с удаленным действием (через дочернее поле), и удалите ObjectID удаленного действия из массива «потомков».

В разделе отладчика count возвращает количество удаленных документов, действие кажется пустой строкой, и больше ничего не возвращается (переменная «something» не определена).

У меня два вопроса:

  • Как мне выполнить или отклонить обещание в обещании мангуста? В Интернете не так много информации, которой можно было бы следовать (обычно это общий учебник по обещаниям).
  • Если Action.remove (). Exec () не возвращает копию удаленного документа, как мне выполнить другой запрос, чтобы действительно обновить другие документы?

  • Какими вы ожидаете увидеть action и something? 13.05.2015
  • Вы не решаете и не отвергаете обещания мангуста. Они выполняются / отклоняются, когда выполненный вами запрос завершился успешно / не удался. 13.05.2015
  • действие и что-то были заполнителями, я ожидал, что будет возвращена копия удаленного документа, и «что-то» было ошибкой (или они могли быть заменены). 13.05.2015
  • Честно говоря, mpromise - одна из самых ужасных реализаций promises / A +, вам, вероятно, будет даже лучше с нативными обещаниями, если вы сможете их использовать. 13.05.2015
  • Прочитав несколько отзывов о mpromise, я начинаю сожалеть о своем решении пойти по этому пути. Может быть, я найду лучшую. 13.05.2015
  • @PGT вполне возможно использовать обычные / лучшие обещания с мангустом. Например, вы можете сделать var Promise = require("bluebird"); var Mongoose = Promise.promisifyAll(require("mongoose"));, который добавляет Async версии методов, возвращающих обещания bluebird, которые намного проще отлаживать. 13.05.2015

Ответы:


1

Вы можете использовать findByIdAndRemove, чтобы упростить первый шаг (зачем делать два запроса БД?) . В случае успеха разрешенное обещание будет удаленным документом.

exports.destroy = function(req, res) {
  var actionID = req.body.id;

  Action.findByIdAndRemove(actionID).exec().then(function(action) {
    // action.children 
  }).then(null, function(err) {
    // Do something with the error.
  });
};

Оттуда вам нужно будет управлять удалением действий из списка дочерних элементов. Решения для этого включают async, q, bluebird или если вы просто хотите продолжать использовать обещания (вы не заботитесь об управлении нагрузкой, если есть много дочерних элементов или рекурсивное удаление детей), вы можете использовать встроенный Promise, доступный в новых версиях узла.

exports.destroy = function(req, res) {
  var actionID = req.body.id;

  Action.findByIdAndRemove(actionID).exec().then(function(action) {
    return Promise.all(action.children.map(function(id) {
      Action.findByIdAndRemove(id).exec();
    })); // returns promise
  }).then(function (results) {
    // results will be an array of child docs removed.
    // NOTE: this isn't recursive
  }).then(null, function(err) {
    // Do something with the error.
  });
};

Чтобы сделать его рекурсивным (опять же без управления нагрузкой), потребуется немного рефакторинга. Что-то вроде:

exports.destroy = function(req, res) {
  destroy(req.body.id).then(function (results) {
    // results will be a multi-dimesional array if children are removed
    // response
  }).then(null, function (err) {
    // error response
  });
};

function destroy(actionID) {
  return Action.findByIdAndRemove(actionID).exec().then(function(action) {
    return Promise.all(action.children.map(function(id) {
      return destroy(id);
    })); // returns promise
  });
}

Примечание: ни один из этих кодов не был протестирован

13.05.2015
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..