#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`);
}