Могу ли я смешивать обратные вызовы и шаблоны async / await в NodeJS? - PullRequest
1 голос
/ 27 мая 2020

Я искал ответ на inte rnet, но не смог найти то, что искал.

Мне нужно знать, что не так со следующим кодом (при условии, что мы не должны смешивать обратные вызовы и обещания) -

function a(callback){
    (async ()=>{
        try{
           let result = await doSomething();
           callback(null, result);
        } catch(e){
           log('error at await');
           callback(e, null);
        }
    })()
}

Ничего страшного, если я использую вышеуказанный шаблон в своем коде?

1 Ответ

1 голос
/ 27 мая 2020

Можно ли смешивать обратные вызовы и шаблоны async / await в NodeJS?

Можно. Не рекомендуется.

Обычно труднее правильно обрабатывать ошибки при смешивании обратных вызовов и обещаний. Кроме того, поток управления может быть настоящим беспорядком. Этот пример не слишком запутан, потому что здесь всего одна асинхронная операция, но почему бы просто не вернуть обещание и не присоединиться к современной эпохе асинхронного дизайна и вообще не использовать какие-либо простые обратные вызовы? Кроме того, здесь ждать довольно бессмысленно. Вы только что сделали вещи намного более сложными, чем return doSomething(), и попросили вызывающего использовать возвращенное обещание.

Итак, вы можете заменить 9 строк тела функции (включая async IIFE) на 1 простой line.

Причины не смешивать простые обратные вызовы и обещания

  1. Во-первых, все причины использовать обещания в первую очередь вместо простых обратных вызовов. Я не буду повторять все это, потому что они были проанализированы и повторены много раз. Введение любых простых обратных вызовов просто сводит на нет множество причин для использования обещаний в первую очередь.
  2. 100% Код, основанный на обещаниях, обычно будет более компактным и простым (если вы знаете обещания и как их лучше всего кодировать) чем любое их сочетание.
  3. Поток управления усложняется очень быстро, когда вы смешиваете обещания и простые обратные вызовы. У каждого есть модель, как это сделать. Обычные обратные вызовы намного сложнее, если у вас есть несколько параллельных или последовательных асинхронных операций (именно поэтому библиотеки, такие как библиотека async, должны были существовать, когда у нас были только простые обратные вызовы), тогда как этот уровень управления потоком является естественным и встроенным. с обещаниями. Затем попробуйте смешать две модели потока управления и обработки ошибок, и все быстро усложняется.
  4. Многие разработчики допускают ошибки с обработкой ошибок, пытаясь смешать две модели, не имея возможности правильно распространить ошибки обратно. Причина этих ошибок в том, что гораздо сложнее делать это правильно при микшировании.
  5. Обещания - это настоящее и будущее асинхронного программирования в Javascript / nodejs. Вскоре у нас даже будет верхний уровень await и, возможно, даже асинхронный импорт на основе обещаний. Зачем вам добавлять усложнение, чтобы использовать старую модель, которая больше не считается настоящим или будущим языка.
  6. Если у вас есть некоторые асинхронные операции, которые не возвращают обещания, вы можете более целесообразно их использовать поместив вокруг них обертку обещаний (возможно, используя util.promisify()), а затем используя их только в их форме обещаний для вашей фактической реализации и потока управления.
...