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

Kua*_*uan 5 javascript promise

所有:

我是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);
});
Run Code Online (Sandbox Code Playgroud)

我不太了解.then()是如何与Promise一起工作的,现在我可以理解someAsyncThing()返回一个Promise,它将产生一个异常,从而转向.catch()部分.如果我们换resolve(x+2)resolve(4),那么它会去运行someOtherAsyncThing();和返回另一个承诺,

第一个问题是.then()的返回是否是Promise?

第二个问题,如果在someOtherAsyncThing()的承诺,我使用resolve(x+2)造成了异常,那么它也去同.catch()一部分,那么我怎么能作出这样的.catch()只捕获异常引起的someAsyncThing()"为链接的承诺(和同样的问题.then(),如果有任何)?

谢谢

jfr*_*d00 4

第一个问题是 .then() 的返回是否是那个 Promise?

p.then()返回一个承诺 - 永远。如果传递给.then()处理程序的回调返回一个值,则新返回的 Promise 将与父 Promise 同时解析,但将使用处理程序返回的值进行解析。

如果.then()处理程序返回一个承诺,则在处理程序返回的承诺.then()被履行/拒绝之前,返回的承诺不会履行/拒绝。他们被拴在一起。

如果.then()处理程序抛出异常,则返回的 Promise.then()将被拒绝,并将异常作为值。抛出与返回被拒绝的承诺相同。

如果在someOtherAsyncThing()的 Promise 中,我用来resolve(x+2)引发异常,那么它也会转到相同的.catch()部分,那么我怎样才能使其.catch()仅捕获由 someAsyncThing()的 Promise 引起的异常(以及链式的相同问题,.then() 如果有的话)?

Promise 的美妙之处在于,错误会沿着链向上传播,直到得到处理。在任何级别停止错误传播的方法是处理那里的错误。

如果你想分离.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);
});
Run Code Online (Sandbox Code Playgroud)