Делаю программу на javascript с API. Прямо сейчас этот API работает с обратными вызовами и поддерживает как синхронные, так и асинхронные модели выполнения.
Пример вызова API:
API.getInfo((err, info) => {
if (err) return processError(err);
doSomethingUseful(info);
})
У меня есть два исполнителя API - локальный и удаленный.
Пример локального исполнителя:
state.info = {...};
API.getInfo = (cb) => cb(null, clone(state.info));
Пример удаленного исполнителя:
API.getInfo = (cb) => doGet('/info').then(info => cb(null, info), cb)
// express transforms this query to local executor and returns answer
Хитрость в том, что API может называть себя так:
API.getOtherInfo = (cb) => {
let part1, part2;
API.getPart1((err, data) => part1 = data);
API.getPart2((err, data) => part2 = data);
cb(null, {part1, part2})
}
В данном случае это синхронизация, и я хочу, чтобы она синхронизировалась.
Обратные вызовы могут поддерживать как синхронный, так и асинхронный режимы выполнения.
Итак, теперь я хочу использовать современный javascript, но, к сожалению, обещания асинхронны по определению. Есть ли современный подход javascript для синхронизации и асинхронного выполнения, кроме обратных вызовов?
Обычный дизайн конечной точки API, которая иногда может быть синхронизированной, а иногда и асинхронной, заключается в том, чтобы внешний API всегда был асинхронным. Затем вызывающая сторона выполняет один асинхронный дизайн, который всегда работает (независимо от того, синхронны ли внутренние компоненты или нет). Обещания отлично подходят для этого, потому что они помогают сделать его всегда асинхронным.
@ jfriend00, так что единственный вариант - сделать обертку обещаний вокруг ядра синхронизации?
Я не знаю, что вы подразумеваете под оберткой обещаний вокруг ядра синхронизации. Если у вас есть синхронное значение, которое вы хотите вернуть асинхронно, то вместо return value используйте return Promise.resolve(value).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте async () для преобразования синхронизированной функции в асинхронизированную функцию, я думаю, вы ищете эту опцию