почему объект, разрешенный обещанием, не определен?

#node.js #promise

#node.js #обещание

Вопрос:

Вот мой код

 exports.createNewSellerTicket =  function(ticketData,fileNames){
   var SellerTicket = ticketSchema.SellerTicketModel;
   sellerTicket = new SellerTicket(ticketData);
   sellerTicket.save()
   .then(function (ticket) {
            logger.info("New ticket created"));
    fsSrv.createSellerTicketsDirectory(ticket._id);
  })
  .then((obj)=>{  /// obj is null here ??? could not figure it out??
       //// some stuff on obj
    const query = { _id: ticketData._id };
    SellerTicket.updateOne(query, { attachments: pathArr }, {}, function(err,res){
      if (err){
        logger.error(err);
      } 
      logger.info("seller ticket id:" ticketData._id " updated");
    });
  })
  .catch(err =>{
    logger.error(err);
  })
}
 

Вот метод fsSrv.createSellerTicketsDirectory

 function createSellerTicketsDirectory(ticketId){
  return new Promise((resolve,reject) =>{
    try{
      
      var dir = "/" ticketId;
       fs.mkdirSync(dir);
      var obj = new Object();
      obj.dirPath = dir;
      obj.ticketId = ticketId;
      resolve(obj);
    }
    catch(err){
      reject(err);
    }
  });
}
exports.createSellerTicketsDirectory = createSellerTicketsDirectory;
 

когда я его отлаживаю, obj содержит правильные значения, но когда он возвращается обратно в .then(obj), здесь obj не определен. Я не могу понять, что я здесь делаю не так? Любая помощь была бы заметна. Спасибо.

Комментарии:

1. Поскольку сейчас 2020 async год, и await почему бы не переключиться на этот стиль и не сделать свою жизнь намного проще?

2. Если вы хотите, чтобы эта функция была цепочечной, не забудьте о return своем последнем обещании.

Ответ №1:

Для цепочки вы должны быть очень хорошо осведомлены о том, что, если что-либо, вам нужно вернуть с каждого then этапа. В этом случае вы сбросили мяч. Простое решение:

 .then(function (ticket) {
  logger.info("New ticket created"));

  // If you don't return here, the function returns undefined and
  // the next then() has nothing to work with.
  return fsSrv.createSellerTicketsDirectory(ticket._id);
})
 

Это намного менее грязно, если вы просто async это:

 exports.createNewSellerTicket = async function(ticketData,fileNames) {
   const SellerTicket = ticketSchema.SellerTicketModel;

   let sellerTicket = new SellerTicket(ticketData);
   let ticket = await sellerTicket.save();

   logger.info("New ticket created"));
   let obj = await fsSrv.createSellerTicketsDirectory(ticket._id);

   const query = { _id: ticketData._id };

   // Presuming a Promise is available here
   let res = await SellerTicket.updateOne(query, { attachments: pathArr });

   logger.info(`seller ticket id: ${ticketData._id} updated`);
}