2014-01-30 4 views
0

У меня есть следующий кодкак использовать обещание и попытаться поймать блок

var promise = getRaids(client); 
promise.then(function (raids) { 
    res.json(raids); 
}, function (err) { 
    console.error(err); 
    res.send(403, { error: err}); 
}); 

Я хочу, чтобы преобразовать, что в попытке поймать блок, я думаю, что это гораздо более удобные для чтения. Каким будет код?

+0

Try/Catch не работает с обещаниями, вот для чего вы получили функцию ошибки. – clentfort

ответ

1

Я не думаю, что это можно преобразовать в блок try/catch. Для этого потребуется блокировать обещание внутри блока try, а JavaScript не позволяет блокировать обещания.

1

Используйте обещания, как это и это будет читаемыми:

getRaids(client) 
.then(function (raids) { 
    res.json(raids); 
}) 
.catch(function (err) { 
    console.error(err); 
    res.send(403, { error: err}); 
}); 
0

Если вы действительно хотите, вы можете использовать Harmony с Node.js и use generators:

Когда вы бросаете() ошибка на объект-генератор, фактическая ошибка распространяется обратно в код генератора, то есть вы можете на самом деле использовать заявления try и catch, чтобы их поймать.

Если вы собираетесь читаемости обещаний, when.js обеспечивает extended promise API, что позволяет для ключевых слов, таких как catch и finally. Я уверен, что Q и другие библиотеки обещаний имеют схожие механизмы.

promise.then(function() { 

}).catch(function(error) { 

}).finally(function() { 
    // cleanup/etc. 
}); 
+0

Q.js действительно предлагает '.catch()' и '.finally()', но, пожалуйста, помните, что ни один из методов не предоставляет мощность фильтрации '.then()', то есть способность возвращать новое разрешенное или неразрешенное обещание. Следовательно, вам может понадобиться 'prom.then (...). Catch (...). Finally (...);' (как указано выше), 'prom.catch (...). Finally (...) .then (...); 'или даже' prom.then (...). catch (...). finally (...). then (...); ', в зависимости от обстоятельств. –

+0

Я не слишком хорошо знаком с обещаниями 'Q'. Однако с обещаниями 'when.js' вы можете вернуть новое обещание в' catch() ', например. 'prom.then (...). catch (function (err) {return newPromise;})'. Вы не можете вернуть новое обещание от 'finally (...)', но я не вижу случая использования, почему кто-то когда-либо захочет это сделать. –

Смежные вопросы