Arhn - архитектура программирования

Дождитесь завершения Meteor.call перед вставкой коллекции

Я делаю приложение MeteorJS, в котором я извлекаю несколько файлов из удаленного API.

Одна запись API может иметь несколько файлов — я хочу загрузить их, сохранить в моей коллекции Media и получить их идентификатор для сохранения в другой коллекции (например, NotMedia):

// Client side: apiArr is an array with api json objects
for(var a in apiArr){
  var pic1_id = Meteor.call('saveMedia', apiArr[a].image1_url);
  var pic2_id = Meteor.call('saveMedia', apiArr[a].image2_url);
  var collection = {
    name: apiArr[a].name,
    description: apiArr[a].desc,
    image1_id: pic1_id,
    image2_id: pic2_id
  };
  NotMedia.insert(collection);
}

мой метод метеора:

//Server side:
Meteor.methods({
  saveMedia: function(media){
    var file = new FS.File();
    file.attachData(media, function(err){
      if(err){
        throw err;
      }
      file.origin_name = media;
      var id = Media.insert(file);
      return id;
    });
  },
});

Но когда я извлекаю сохраненную запись NotMedia, image_id становятся undefined. Я понимаю, что вставка NotMedia завершается быстрее, чем сохранение файлов изображений, но как я могу синхронизировать это/ждать завершения Meteor.calls?


  • Вы можете сделать это с помощью промисов: с несколькими вызовами метода метеора на клиенте"> stackoverflow.com/questions/28633187/ 25.11.2015

Ответы:


1

Взгляните на это: Stackoverflow && Meteor.wrapAsync

wrapAsync — это то, что вы ищете.

Here is a quick code snippet. Hope this helps.

Meteor.methods({
  saveMedia: function(media) {
    var asyncFunc = function(arg1, arg2, callback) {
      var file = new FS.File();
      file.attachData(media, function(err) {
        if (err) {
          callback(err, null);
        }
        file.origin_name = media;
        var id = Media.insert(file);
        callback(null, id);
      });      
    };
    return Meteor.wrapAsync(asyncFunc);
  }
});

25.11.2015
  • Ваш ответ может быть правильным, но вы можете улучшить его, приведя пример кода. 26.11.2015
  • Я пробовал Meteor.wrapAsync разными способами, но безуспешно - пример кода был бы отличным 26.11.2015

  • 2

    Здесь две ошибки:

    1) если вы используете Meteor.call для метода, определенного на сервере, Meteor.call вернет undefined, потому что метод вызывается асинхронно. Вместо Meteor.call в методах на стороне сервера вы должны указать функцию обратного вызова.

    2) похоже, что вы вызываете асинхронную функцию на стороне сервера, и вы не можете этого сделать.

    Meteor.methods({
      saveMedia(media) {
        let file = new FS.File();
    
        // this takes a callback func.. that tells me this is asynchronous - bad!
        file.attachData(media, function (err) {
          if (err) {
            throw err;
          }
          file.origin_name = media;
          return Media.insert(file);
        });
      }
    });
    
    25.11.2015
  • Я пробовал этот «ад обратного вызова», но он не работает, поэтому я решил задать этот вопрос. 26.11.2015
  • Отредактировал мой ответ. Я вижу проблему. Не используйте асинхронные операции в методах. 26.11.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..