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

Как я могу передать обещание resolve() другому обещанию

Допустим, у меня есть модуль "JsonEditor" (просто для примера), который имеет 3 функции: get(), setProperty() и save().

Вот код (следует вопрос):

var fs   = require('fs')
  , q    = require('q');

var jsonEditorModule = (function() {
    return {
        get: function(jsonPath) {
            // ...
        },

        save: function(jsonObject, jsonPath) {
            var qJson = q.defer();

            var jsonContent = JSON.stringify(jsonObject, null, 2);

            fs.writeFile(jsonPath, jsonContent, function(err) {
                if(err) {
                    qJson.reject(err);
                }
                else {
                    qJson.resolve();
                }
            });

            return qJson.promise;
        },

        setProperty: function(prop, value, jsonPath) {
            var self = this;
            var qJson = q.defer();

            this.get(jsonPath)
            .then(
                function(jsonObject) {
                    // Set the property
                    jsonObject[prop] = value;

                    // Save the file
                    self.save(jsonObject, jsonPath)
                    .then(
                        function() {
                            qJson.resolve();
                        },
                        function() {
                            qJson.reject();
                        },
                    );
                }
            );

            return qJson.promise;
        },
    };
})();

module.exports = jsonEditorModule;

Видите then() сразу после save() в функции setProperty()?

Выглядит глупо, правда?

Нужно ли мне вручную разрешать() и отклонять() мое обещание? Могу ли я просто передать поведение save() моему обещанию setProperty()?

Надеюсь, вопрос достаточно ясен (и не слишком глуп).

Спасибо

05.03.2015

  • Посмотрите здесь и посмотрите, сможете ли вы переработать структуру вызовов, чтобы настроить цепочку stackoverflow.com/questions/12461589/ 05.03.2015

Ответы:


1

То, чего вы хотите достичь, описано здесь: связывание, в основном, если обработчик возвращает обещание (давайте вызовем it innerPromiseFromHandler), то обработчики .then, которые были определены в предыдущем промисе, будут выполнены, когда innerPromiseFromHandler получит значение разрешения:

var jsonEditorModule = (function() {
  return {
    get: function(jsonPath) {
      return Q.delay(1000).then(function () {
        document.write('get...<br/>');
        return 'get';
      });
    },

    save: function(result) {
      return Q.delay(1000).then(function () {
        document.write('save...<br/>');        
        return result + ' save';
      });
    },

    setProperty: function(prop, value, jsonPath) {
      return this.get(jsonPath)
        .then(function(result) {
          return jsonEditorModule.save(result);
        });
    }
  };
})();
      
jsonEditorModule
  .setProperty()
  .then(function (result) {    
    document.write(result + ' finish');
  })
<script src="http://cdnjs.cloudflare.com/ajax/libs/q.js/0.9.2/q.js"></script>

05.03.2015
  • Объявление jsonEditorModule вне IIFE в значительной степени противоречит смыслу IIFE. Вы должны задекларировать его внутри и вернуть. 05.03.2015
  • Даже если это модуль CommonJS, загружаемый через require()? Я не скопировал конец моего файла module.exports = jsonEditorModule; 05.03.2015
  • Спасибо, Маурисио. Это совершенно ясно (и даже лучше, не снисходительно) 05.03.2015

  • 2

    Выглядит глупо, правда? Нужно ли мне вручную resolve() и reject() выполнять обещание?

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

    Могу ли я просто перенести поведение save() на обещание setProperty()?

    Да, это тривиально возможно — и это встроено в метод then: вызов .then() возвращает новое обещание для значения return ваших обратных вызовов, даже если это значение скрыто в обещании.

    var jsonEditorModule = {
        get: function(jsonPath) {
            // ...
        },
        save: function(jsonObject, jsonPath) {
            return Q.ninvoke(fs, "writeFile", jsonPath, JSON.stringify(jsonObject, null, 2));
        },
        setProperty: function(prop, value, jsonPath) {
            return this.get(jsonPath).then(function(jsonObject) {
    //      ^^^^^^
                // Set the property
                jsonObject[prop] = value;
                // Save the file
                return this.save(jsonObject, jsonPath);
    //          ^^^^^^
            }.bind(this));
        }
    };
    
    05.03.2015
    Новые материалы

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

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

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

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

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

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

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