Вы можете вернуть буквально все, что угодно из конструктора JavaScript, так что это возможный шаблон:
class DontDoThis {
constructor(props) {
this.name = props.name;
const results = this.readFile(props);
// As a side-effect of the promise completing, set a field
results.then(data => this.oriData = data);
// Force this constructor to be treated as async
// even though we cannot say `async constructor`
return results.then(() => this, () => this);
}
}
async function process(...) {
const complexData = await new DontDoThis(...);
}
Тем не менее, далеко, далеко лучше просто иметь функцию, которая создает окончательное значение:
interface ImageData { name: string, oriData: any };
// This can also be a static method, e. g. `ImageData.create(...)`
async function ComplexData(props): Promise<ImageData> {
return readFile(props).then(data => ({name: props.name, oriData: data}));
}
async function process(props) {
const complexData = await ComplexData(props);
}
ImageData
может быть классом вместо интерфейса - главное отметить, что он не может быть создан частично - либо ComplexData
завершится успешно и создаст объект ImageData
, либо произойдет сбой, и вы не получите один на всех. У вас никогда не бывает небезопасного в использовании, потому что он наполовину инициализирован ImageData
объекта, лежащего вокруг.