Вы на самом деле возвращаете результат функции decompress
, но это асинхронная функция c, поэтому возвращаемое значение на самом деле не имеет значения и, вероятно, undefined
.
. обратный вызов, который вы передаете, чья подпись, вероятно, выглядит следующим образом:
decompress(..., function(err, result) {
// Do what you want with the error and the result
})
Чтобы использовать обещание вместо обратного вызова для выполнения асинхронной задачи, вы можете заключить свою функцию в обещание, как показано ниже, и так как Вы внутри then
другого Обещания, оно будет цепочкой .
function downloadObject() {
return getObject(...).then((archive) => {
console.log("Downloaded.");
fs.writeFileSync(...);
return new Promise((resolve, reject) =>
decompress(..., function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
})
);
})
}
Это еще не все, это работает, но мы можем добиться большего. writeFileSync
заблокирует ваш IO
в узле, и мы этого не хотим. Вместо этого предпочтительнее использовать writeFile
, и все будет чище, если использовать цепочку Promise:
function downloadObject() {
return getObject(...)
.then((archive) => new Promise((resolve, reject) => {
fs.writeFile("<filename>", archive?.data, '<file-encoding>', err => {
if (err) {
reject(err);
} else {
resolve(archive);
}
})
}))
.then((archive) => new Promise((resolve, reject) => {
decompress(archive, function(err, result) {
if (err) {
reject(err);
} else {
resolve(result);
}
})
}));
}
Конечно, это псевдокод, я не знаю, что находится в вашем archive
объекте, я также не знаю сигнатуру типа вашей функции decompress
, но важно показать, как обернуть функцию стиля обратного вызова в Promises, объединить их в цепочку, а также правильно обрабатывать ошибки с помощью функции reject
, предоставляемой Promises.