我是JavaScript承诺的新手,我正在尝试将它们应用到Android设备上的某些PhoneGap代码中。我想记录异常,看起来异常被吞噬了。请参阅下面的示例代码。由于调用不存在的函数“thiswillfail”而引发的异常不会显示在任何地方。我注释掉了不相关的代码并添加了代码以强制调用AddRecord promise。代码检查是否存在记录,如果不存在,则返回错误所在的AddRecord promise。我没有使用任何第三方库。我做错了什么?
编辑:如果我在链“DoSomethingWithRecord”中添加另一个promise,则当期望跳过catch时调用此promise。
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 :(得分:0)
当你这样做时,你无法从promise构造函数返回:
else return AddRecord();
没有什么会等待AddRecord,相反,你想用AddRecord来解决,它会在解决诺言之前等待它:
else resolve(AddRecord());
但是,如果这是您的代码,您只需return AddRecord()
而不是使用promise构造函数。 promise构造函数(新的Promise)主要用于将非承诺API转换为承诺,并且不应该与已经使用过的API一起使用。请改用then
。