Как возвращать договоренность обещаний?

Я стараюсь вооружать file tree view. Используя книжный магазин fs node и книжный магазин bluebird, чтобы направлять асинхронные методы, которые у них есть callback внутри книжного магазина fs, я прибыл в эту функцию:

const generarObjeto = directorio => {  
return fs.readdirAsync(directorio)
  .then(arregloDeNombres => {
    const promesasDeArchivos = arregloDeNombres.map(nombreDelArchivo => {
      const rutaCompleta = `${directorio}/${nombreDelArchivo}`;
      return fs.statAsync(rutaCompleta)
        .then(infoArchivo => {
          const archivo = {};
          archivo.rutaDelArchivo = rutaCompleta;
          archivo.esArchivo = infoArchivo.isFile();
          if (!archivo.esArchivo) {
            return generateFileTreeObject(archivo.rutaDelArchivo)
              .then(otrosNombresDeArchivos => {
                archivo.files = otrosNombresDeArchivos;
              })
              .catch(console.error);
          }
          return archivo;
        });
    });
    console.log(promesasDeArchivos);
    return Promise.all(promesasDeArchivos);
  });
};

Все функционирует очень хорошо, однако в конце функции, мы можем видеть, что я делаю один console.log "promesasDeArchivos", и эти приходят пустота следующего способа:

[ Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined } ]
[ Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined },
  Promise {
    _bitField: 0,
    _fulfillmentHandler0: undefined,
    _rejectionHandler0: undefined,
    _promise0: undefined,
    _receiver0: undefined } ]

Эта переменная была бы должна наполняться со стоимостью, которая есть у другой переменной, которую называются файл, как мы можем видеть это в return, у этой переменной есть стоимость, но в пользу какого-то мотива они не проходят с другой. Уже я он кружил вокруг этого и я не нахожу ошибку.

Спасибо перед рукой из-за помощи.

РЕДАКТИРОВАНИЕ:

Я изменил немного код, чтобы делать debug, после заявления "rutaComplete", вместо того, чтобы возвращаться одного, объявил другую переменную и распределил ему стоимость "fs.statAsync" и сделал один утешил log результата и с там идет пустота, там мотив, из-за которого "promesasDeArchivos" приходит пустота, однако мне не удается понять мотив под, который последует за этим, если, как мы можем видеть, я делаю return в каждом повторении, и в делать debug, изменчивая у файла есть стоимость, сделав return.

0
задан 09.03.2019, 00:51
1 ответ

Как я вижу в тебе cГіdigo возможную ошибку, которую я вижу, дело в том, что ты не возвращаешь 'файл', когда ты используешь promise 'generateFileTreeObject', так как, не возвратив, ты не возвращаешь стоимость, и поэтому он появляется у тебя 'undefined'.

произошел с Тобой cГіdigo с возможным решением:

const generarObjeto = directorio => {
return fs.readdirAsync(directorio)
    .then(arregloDeNombres => {
        const promesasDeArchivos = arregloDeNombres.map(nombreDelArchivo => {
            const rutaCompleta = `${directorio}/${nombreDelArchivo}`;
            return fs.statAsync(rutaCompleta)
                .then(infoArchivo => {
                    const archivo = {};
                    archivo.rutaDelArchivo = rutaCompleta;
                    archivo.esArchivo = infoArchivo.isFile();
                    if (!archivo.esArchivo) {
                        return generateFileTreeObject(archivo.rutaDelArchivo)
                            .then(otrosNombresDeArchivos => {
                                archivo.files = otrosNombresDeArchivos;
                                return archivo // --> Esto es lo que faltaba
                            })
                            .catch(console.error);
                    }
                    return archivo;
                })
                .catch(console.error)// --> Controlar el posible error
        });
        console.log(promesasDeArchivos);
        return Promise.all(promesasDeArchivos);
    })
    .catch(console.error)// --> Controlar el posible error

};

Подождал, что он soluciГіn, я помог тебе решать твою проблему.

Приветствие

0
ответ дан 02.12.2019, 05:52
  • 1
    Привет друг, я рассказываю тебе, что probé то, что ты сказал мне, и я остаюсь с той же проблемой, если ты обращаешь внимание return файла, - справедливый despué s этого if –  Alex 08.03.2019, 17:22
  • 2
    Привет Алекс, верно, что ты возвращаешь ' archivo' despué s, но если ты обращаешь внимание, ты возвращаешься ' generateFileTreeObject' из-за которого не retornarí в файл как ты говоришь, но tendrí эксперт, что возвращать это как прокомментировало тебе. ¿ Ты можешь añ adir ' .catch (console.error) ' в ' then' что у тебя есть из-за sí есть ошибка, которую мы не контролируем? (я издаю тебя có я говорю для того, чтобы ты знал, которое я имею в виду) –  planta4 09.03.2019, 18:21