У меня есть небольшой пакет утилит npm Utilities
, который я хочу использовать для двух моих кодовых баз, AppA
и AppB
.
Утилиты предоставят класс с некоторыми функциями, и онэто работа AppA и AppB для создания подкласса, где это необходимо.
class Utilities {
processData(data, callback) {
var result = this.validateData(data);
// This will fail for AppB, because validateData returns a promise.
var length = result.length;
callback(length);
}
validateData(data) {
// Must be subclassed
}
}
AppA:
class AppA extends Utilities {
validateData(data) {
return [1, 2, 3];
}
}
AppB:
class AppB extends Utilities {
validateData(data) {
// returns a Promise
return AsyncMethods.checkData(data);
}
}
Пакет Utilities написан синхронно, как и приложение A. Однако AppB требует взаимодействия с некоторыми асинхронными методами внутри validateData.Мой класс Utilities, однако, не знает, что у потребителя есть асинхронный API.
Я могу с легкостью менять как Утилиты, так и AppB, но не AppA.Поэтому мне нужен способ написания утилит таким образом, чтобы он мог работать как в синхронной, так и в асинхронной средах.
В идеале я бы просто изменил AppB и заставил его ждать:
class AppB {
async validateData(data) {
var result = await AsyncMethods.checkData(data);
return result;
}
}
Однакоэто все равно возвращает объект Promise, а не фактический результат, потому что это асинхронная функция.
Еще одно решение, которое не дотягивает до работы, - это ожидание внутри processData в Utilities:
async processData(data, callback) {
var result = await this.validateData(data);
var length = result.length;
callback(length);
}
Однакоэто нарушает работу AppA, поскольку его реализация не является асинхронной, и я не могу изменить AppA.
Есть ли здесь какие-либо варианты?Возможно, способ сделать все функции await
по умолчанию?
Вот скрипка: https://jsfiddle.net/1ptoczh7/3/
Примечание для AppB: результат не определен.Мне нужно иметь возможность получить оба выхода без изменения AppA.