В следующем коде thing
- внешний объект, который я не контролирую; Я не могу изменить, как работает система событий thing
. Когда вызывается fn
, мы возвращаем обещание, исполнитель которого слушает событие, а затем начинает ожидание ряда функций, которые в конечном итоге приводят к срабатыванию этого события:
function fn() {
return new Promise(async function(resolve, reject) {
// This handler must be attached before `c` is called
thing.once('myEvent', function(e) {
resolve(e.data); // done
});
// The order of these functions calls is important,
// and they may produce errors that need to be handled.
await a();
await b();
await c(); // this causes myEvent
});
}
Это отлично работает, но мне сказали, что это обещание анти-шаблона и что я должен сделать fn
функцию async
. Как мне это сделать? Если я сделал fn
функцию async
, то как я могу разрешить e.data
из обработчика события?
Изменить:
Я принял ответ Берги, потому что он полезен для объяснения анти-шаблона и того, как он применяется к этому сценарию. Сказав это, я думаю, что приведенный выше код более читабельен и явно показывает, что происходит, поэтому я собираюсь сохранить его как есть. Это не нуб, осуждающий лучшие практики, это просто для моего случая использования, следуя правилам, делает вещи более сложными, чем они должны быть. Конечно, это оставляет меня открытыми для определенных проблем, но мне просто нужно будет жить с этим, пока не найду лучший способ сделать это.