2014-12-05 2 views
1

Я новичок в обещаниях 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); 
}} 

ответ

0

Вы не можете вернуться из конструктора обещание, когда вы делаете:

else return AddRecord(); 

Ничто будет ждать AddRecord, вместо этого, вы не хотите, чтобы решить с AddRecord, который будет ждать его до того, разрешающего обещание:

else resolve(AddRecord()); 

Однако, если это ваш код, который вы можете просто return AddRecord() вместо того, чтобы использовать конструктор обещание в любом случае. Конструктор обещаний (новый Promise) в основном полезен для конвертирования API без обещаний в обещания и не предполагается использовать с уже обещанными API. Вместо этого используйте then s.

+0

Кроме того, 'thisWillFail' должен бросать, чтобы терпеть неудачу, обещает только знать об ошибке с помощью значений throw/return или с помощью reject/resolve в конструкторе обещаний (который снова - вы, вероятно, не должны здесь использовать) –

+0

Спасибо, что приняли посмотри на это. Ваше предложение, похоже, устраняет проблему проглатывания исключения, но я все еще не вижу ожидаемого поведения. Я намеренно добавил строку thisWillFail (которая не существует), чтобы вызвать исключение. Ожидаемое поведение состояло в том, что все другие обещания в цепочке были пропущены, исключение было бы захвачено .catch и alert («done») должно выполняться. Исключение теперь поймано, но оно попадает в try/catch, а не в .catch. Кроме того, DoSomethingWithRecord все еще выполняет и предупреждает («сделано»). Очень странно. – dp22193

+0

Я пробовал этот точный тест, используя q.js, и все работает так, как ожидалось. Исключение попадает в .catch, DoSomethingWithRecord не выполняется, и я получаю предупреждение. Я не уверен, что это то, с чем я пытаюсь реализовать собственные обещания или ограничения, но так как я работаю с Q, я буду придерживаться этого. – dp22193

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