如何决定当时/捕获的承诺

时间:2015-12-12 00:22:24

标签: javascript promise

所有

我是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()同样的问题,如果有没有??

由于

3 个答案:

答案 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"