Вот пример, он похож на @hsz, но я поместил обработку для внутреннего обратного вызова.
Если вы передаете обратный вызов, он делает это способом обратного вызова, если нет, возвращаетОбещание вместо этого.
Если вы запустите фрагмент, вы сможете увидеть его в действии.Я в основном создал простую функцию setTimeout, которая случайным образом завершается ошибкой, чтобы показать, как выполняется обработка ошибок.Чтобы увидеть полный эффект, попробуйте запустить фрагмент несколько раз.
function doInner(name, callback) {
setTimeout(() => {
if (Math.random() < 0.5)
callback(null, "Did " + name);
else callback(new Error("Oops in " + name));
}, 1000);
}
function doSomething(name, callback) {
if (callback) {
doInner(name, (err, result) => {
if (callback) callback(err, result);
});
} else return new Promise((resolve, reject) => {
doInner(name, (err, result) => {
if (err) reject(err);
else resolve(result);
});
});
}
//now lets test both ways
doSomething("test callback", (err, result) => {
if (err) console.error(err);
else console.log(result);
});
(async function () {
try {
const result = await doSomething("Promise");
console.log(result);
} catch(e) {
console.error(e);
}
}());