所有
我是Promise的新手,这是一个例子:
private void frmRegisterScreen_Load(object sender, EventArgs e)
{
//set the database connection and the Sql command to be used
string conString = "Server = .\\sqlexpress; trusted_connection = yes; database=he_dados;";
SqlConnection con = new SqlConnection(conString);
string sel = "Select * from Customer;";
SqlCommand selCmd = new SqlCommand(sel, con);
//set the form properties relate to the customer registration
lblMain.Text = "View Customer Registers";
tsbSave.Text = "View";
}
我不太了解.then()如何与Promise一起工作,现在我可以理解var someAsyncThing = function() {
return new Promise(function(resolve, reject) {
// this will throw, x does not exist
resolve(x + 2);
});
};
var someOtherAsyncThing = function() {
return new Promise(function(resolve, reject) {
reject('something went wrong');
});
};
someAsyncThing().then(function() {
return someOtherAsyncThing();
}).catch(function(error) {
console.log('oh no', error);
});
返回一个Promise,它将生成一个异常,从而转到someAsyncThing()
部分。如果我们将.catch()
更改为resolve(x+2)
,那么它将运行resolve(4)
并返回另一个承诺,
第一个问题是.then()的返回是否是Promise?
第二个问题,如果在someOtherAsyncThing();
的承诺中,我使用someOtherAsyncThing()
导致异常,那么它也会转到同一个{{1部分,然后如何使resolve(x+2)
仅捕获由.catch()
的承诺引起的异常(对于链式.catch()
同样的问题,如果有没有??
由于
答案 0 :(得分:3)
第一个问题是.then()的返回是否是Promise?
p.then()
返回一个承诺 - 永远。如果传递给.then()
处理程序的回调返回一个值,那么新返回的promise将与父承诺同时解析,但将使用处理程序返回的值解析。
如果.then()
处理程序返回一个promise,那么.then()
返回的promise将不会被执行/拒绝,直到处理程序返回promise为fullfilled / rejected。他们被捆绑在一起。
如果.then()
处理程序抛出,则.then()
返回的承诺是
以异常作为值拒绝。投掷与退回被拒绝的承诺相同。
如果在
someOtherAsyncThing()
的承诺中,我会使用resolve(x+2)
来导致 一个例外,那么它也将转到相同的.catch()
部分,然后是如何 我可以使.catch()
仅捕获由此引起的异常someAsyncThing()
的承诺(以及链式.then()
的相同问题 如果有的话??
承诺的美妙之处在于错误会在链条上传播直到处理完毕。你在任何级别停止错误传播的方法是在那里处理错误。
如果你想分开.catch()
机会,那么你必须抓住较低的水平。例如:
someAsyncThing().then(function() {
return someOtherAsyncThing().catch(function(err) {
// someOtherAsyncThing rejected here
// you can handle that rejection here and decide how you want to proceed
// for example, suppose you just want to handle the rejection, log it
// and then continue on as if there was no problem, you can just return
// a value here
return 0;
});
}).catch(function(error) {
console.log('oh no', error);
});
答案 1 :(得分:3)
错误在承诺中冒出来,直到它们被抓住。
如果您有以下内容(<=
表示包含):
Promise1 <= Promise2.catch(e) <= Promise3 <= throw
然后Promise3抛出并拒绝。 Promise2拒绝然后被抓住。 Promise1成功解析,因为它没有被拒绝。
Promise1 <= Promise2.catch(e) <= Promise3 <= throw
^ resolves ^ rejects ^ rejects
将其视为异步try / catch。
Promise1 = Promise.reject(err); // or throw
Promise2 = Promise1.catch(err => {
// error caught
});
Promise3 = Promise1.catch(err => {
throw err;
// error not caught but thrown back
});
// Now Promise1 is rejected. Promise2 is resolved. Promise3 is rejected.
您还需要知道每个then/catch
调用都会创建一个新的Promise。我建议你阅读Promises/A+ spec并将其作为参考。
答案 2 :(得分:2)
你可以在内心的承诺上catch()
:
a().then(function() {
return b().catch(function() {
console.log('boo');
});
}).catch(function(error) {
console.log('oh no', error);
});
如果a()
拒绝,则会记录"oh no"
。如果b()
拒绝,则会记录"boo"
,但不会记录"oh no"
。