Я новичок в обещаниях JavaScript, и я пытаюсь внедрить их в какой-то код PhoneGap на устройстве Android. Я хочу записывать исключения, и похоже, что где-то проглатываются исключения. См. Пример кода ниже. Исключение, вызванное вызовом несуществующей функции «thiswillfail», нигде не отображается. Я прокомментировал не относящийся к делу код и добавленный код, чтобы заставить вызов AddRecord вызываться. Код проверяет, существует ли запись и, если нет, возвращает обещание AddRecord, которое является ошибкой. Я не использую сторонние библиотеки. Что я делаю не так?Исключение JavaScript потеряно в цепочке Promise
Редактировать: Если я добавлю еще одно обещание в цепочке «DoSomethingWithRecord», это обещание вызывается, когда ожидание заключается в том, чтобы перейти к улову.
function TestPromiseExceptionHandling() {
var record = null;
var CheckForRecord = function() {
return new Promise(function (resolve, reject) {
//getData(
// function (data) {
var data = "";
if (data != "") {
//record = new Record(data);
record = "existed";
resolve();
}
else return AddRecord();
// },
// function (err) {
// reject(new Error("An error occurred retrieving data, msg=" + err.message));
// });
});
};
var AddRecord = function() {
return new Promise(function (resolve, reject) {
thiswillfail();
//add record
var success = true;
record = "new";
if (success) resolve();
else reject(new Error("add record failed"));
});
};
var DoSomthingWithRecord = function() {
return new Promise(function (resolve, reject) {
alert(record);
resolve();
});
};
try {
CheckForRecord()
.then(DoSomthingWithRecord())
.catch(function (err) { alert(err.message);})
.then(function() { alert("done"); });
} catch (err) {
alert(err.message);
}}
Кроме того, 'thisWillFail' должен бросать, чтобы терпеть неудачу, обещает только знать об ошибке с помощью значений throw/return или с помощью reject/resolve в конструкторе обещаний (который снова - вы, вероятно, не должны здесь использовать) –
Спасибо, что приняли посмотри на это. Ваше предложение, похоже, устраняет проблему проглатывания исключения, но я все еще не вижу ожидаемого поведения. Я намеренно добавил строку thisWillFail (которая не существует), чтобы вызвать исключение. Ожидаемое поведение состояло в том, что все другие обещания в цепочке были пропущены, исключение было бы захвачено .catch и alert («done») должно выполняться. Исключение теперь поймано, но оно попадает в try/catch, а не в .catch. Кроме того, DoSomethingWithRecord все еще выполняет и предупреждает («сделано»). Очень странно. – dp22193
Я пробовал этот точный тест, используя q.js, и все работает так, как ожидалось. Исключение попадает в .catch, DoSomethingWithRecord не выполняется, и я получаю предупреждение. Я не уверен, что это то, с чем я пытаюсь реализовать собственные обещания или ограничения, но так как я работаю с Q, я буду придерживаться этого. – dp22193