Я раньше не видел точно такого способа кодирования, поэтому трудно комментировать, правильный ли это способ, не зная немного больше о том, что вы действительно пытаетесь сделать. Я предполагаю, что блок:
try {
var resultOne = requestSync()
var resultTwo = callback(resultOne)
// more async callback functions will reside here
} catch (e) {
console.error('error occured somehwere = ' + e);
} finally {
}
... вызывает другую функцию «обратного вызова», чем в первом фрагменте кода (иначе вы передаете resultOne в качестве первого параметра, и функция обратного вызова будет считать это допустимым объектом ошибки и выдаст ошибку).
Однако, чтобы ответить на ваш вопрос, будет ли код продолжать работать, если одна из функций выдаст ошибку, ответ будет отрицательным — он перейдет непосредственно к блоку catch. Взгляните на: эту документацию по адресу MDN
Особенно эта часть:
Предложение catch содержит операторы, которые определяют, что делать, если в блоке try возникнет исключение. То есть вы хотите, чтобы блок try завершился успешно, а в случае неудачи вы хотите, чтобы управление передавалось блоку catch. Если какой-либо оператор в блоке try (или в функции, вызываемой из блока try) выдает исключение, управление немедленно переходит к предложению catch. Если в блоке try не выдается исключение, предложение catch пропускается.
Я надеюсь, что это отвечает на ваш основной вопрос. Поскольку вы, кажется, заключаете все асинхронные вызовы в Meteor.wrapAsync(), им следует дождаться возврата результата, прежде чем вызывать следующую функцию, если она реализована правильно. Я могу порекомендовать просмотреть этот ответ для получения дополнительной информации о правильном способе реализации wrapAsync и обработки ошибок.
ОБНОВЛЕНИЕ
Я подумал, что было бы интересно сделать пример, так как этот пост уже становится длинным. Взгляните на этот пример, который я загрузил на Github, он может дать вам нужные ответы.
Так всегда ли объект «ошибка», возвращаемый из http-вызова, распознается как объект ошибки?
Итак, fibers/future предполагает стандартный обратный вызов узла в качестве последнего аргумента с объектом ошибки в качестве первого параметра и объектом результата в качестве второго. Пока это так, ошибка будет перехвачена в блоке «поймать», и выполнение будет остановлено.
Если да, то как я могу добавить еще одно поле, чтобы ошибка имела смысл для меня?
Не уверен, что именно вы здесь думаете, но взгляните на мой пример на Github. Там я создаю объект ошибки. Если вы вместо использования setTimeout (где я просто моделирую асинхронный вызов), создайте свою функцию таким же образом, поймайте объект ошибки из удаленного вызова, добавьте к нему поле или измените err.message на что-то более значимое для вас, а затем вызовите обратный вызов. Думаю, это должно сработать, но я не проверял именно это.
Если есть ошибка, но объект ошибки не передается, каково соглашение узла для создания объекта ошибки, который я могу вернуть?
См. пример еще раз. wrapAsync работает только на сервере, предполагается, что функция, которую вы вызываете, имеет обратный вызов в качестве последнего (или единственного) параметра. Этот обратный вызов должен иметь ошибку в качестве первого параметра и результат в качестве второго. Большинство функций узла (если не все) будут соответствовать этим правилам.
Если вы по какой-то причине хотите обработать обратный вызов самостоятельно, вам нужно обязательно вызвать обратный вызов вручную и передать «null» в качестве первого параметра, если нет ошибки, или создать объект ошибки и передать его как первый параметр, если есть ошибка. Посмотрите в примере на wrapAsyncTest.js.
person
cfs
schedule
24.02.2015