Возникла проблема при возврате обновления obj из разрешения обещания - Nodejs - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть файл parser.js ниже в lib / rrpair / parser.js.У меня есть функция синтаксического анализа, где я перебираю различные файлы в каталоге и подготавливаю объект службы из их содержимого.

const dir = require('node-dir');

function parse(path) {
  return new Promise(function (resolve, reject) {
      const serv = new Service();
      dir.readFiles(path, function (err, content, filename, next) {
          //getting files content & preparing/updating service object
          next();
        });
    //returning serv object
    return resolve(serv); 
  });
}

Я вызываю вышеуказанную функцию синтаксического анализа снизу Controllers / serviceController.js

 const rrpair = require('../lib/rrpair/parser');

function createService(req, res) {
  rrpair.parse('./RRPair' ).then(function(message){
    console.log(message);
    res.json(message);
  }).catch(function(err){
    console.log(err);
  });
}

проблема: - Я получаю пустой сервисный объект, возвращенный из функции парсера.Я отладил его и обнаружил, что функция dir.readFiles () в parser.js выполняется, но позже, после возврата объекта службы.Таким образом, функция парсера возвращает новый объект Service (), но не обновленный объект, который обновляется в функции dir.readFiles ().

во время отладки я обнаружил, когда управление переходит к dir.readFiles (строка .., если я нажимаю F10 (шаг), чем управление переходит к возвращаемой строке разрешения (serv); и возвращает новый объект службы безОбновление. Более поздний контроль снова возвращается в функцию dir.readFiles (..., но сейчас не нужно выполнять это, так как я уже получил новый пустой служебный объект. Я не могу решить / понять это с помощью отладки. Я новичокв Nodejs. Пожалуйста, помогите

1 Ответ

0 голосов
/ 23 ноября 2018

Вам необходимо resolve внутри обратного вызова, после того, как next заполняет службу (иначе, если вы звоните resolve снаружи обратного вызова, синхронно , не было бы особого смысла использовать Promise во-первых, потому что ни у каких асинхронных операций еще не было возможности выполнить свою работу).

Вы также должны рассмотреть отклонение Promise при наличии err вместо игнорирования ошибок - в противном случае ошибка не будет обнаружена catch в createService:

function parse(path) {
  return new Promise(function (resolve, reject) {
    const serv = new Service();
    dir.readFiles(path, function (err, content, filename, next) {
      if (err) return reject(err);
      //getting files content & preparing/updating service object
      next();
      resolve(serv); 
    });
  });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...