Javascript 如何决定a then/catch根据哪个承诺

Javascript 如何决定a then/catch根据哪个承诺,javascript,promise,Javascript,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(resolv

全部:

我是个新来的人,这里有一个例子:

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);
});
我不太明白.then()如何与Promise一起工作,现在我可以理解
someAsyncThing()
返回一个Promise,它将生成一个异常,从而转到
.catch()
部分。如果我们将
resolve(x+2)
更改为
resolve(4)
,那么它将运行
someOtherAsyncThing()
并返回另一个承诺

第一个问题是.then()的返回是否就是这个承诺?

第二个问题,如果在
someOtherAsyncThing()
的承诺中,我使用
resolve(x+2)
引起异常,那么它也会转到相同的
.catch()
部分,那么我如何才能做到
。catch()
只捕获由
someAsyncThing()
的承诺引起的异常(对于chained
。then()
,如果有相同的问题)

谢谢

第一个问题是,如果.then()的返回是该承诺的唯一结果吗

p.then()
始终返回承诺。如果传递给
.then()
处理程序的回调返回值,则新返回的承诺将与父承诺同时解析,但将使用处理程序返回的值解析

如果
.then()
处理程序返回一个承诺,则
.then()
返回的承诺在处理程序返回的承诺被完全填充/拒绝之前不会得到满足/拒绝。它们被链接在一起

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

如果在
someOtherAsyncThing()
的承诺中,我使用
resolve(x+2)
来引起 如果出现异常,那么它也将转到相同的
.catch()
部分,然后如何执行 我可以使
.catch()
仅捕获由
someAsyncThing()
的承诺(对于chained
来说也是同样的问题。然后()
如果有的话)

承诺的美妙之处在于,错误会在处理之前一直向上传播。在任何级别阻止错误传播的方法都是在那里处理错误

如果要分离
.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);
});

错误在承诺中冒出来,直到被抓住为止

如果您有以下(
您可以
catch()
关于内部承诺:

a().then(function() {
  return b().catch(function() {
    console.log('boo');
  });
}).catch(function(error) {
  console.log('oh no', error);
});

如果
a()
拒绝,将记录
“哦不”
。如果
b()
拒绝,将记录
“boo”
,但不会记录
“哦不”

catch将捕获链中的任何异常,以便获得有关异常的更丰富信息,或者根据引发异常的承诺做一些不同的事情,您必须拒绝该异常,并在catch块中处理这些信息。@PixMach谢谢,明白了。这非常灵活,很难使用很好。谢谢,所以在我的案例中,捕获的上下文基本上会根据then()中的内容而改变。请参阅其他关于承诺链如何工作的答案,他们解释得相当好。谢谢,明白了。这非常灵活,有点难理解。您有任何关于承诺和then()的链接吗非常容易理解?@Kuan-我没有最喜欢的参考资料。这看起来涵盖得很好:。如果你只是按照这里的问题使用
promise
标记,你也会学到很多东西,因为你会发现主要promise库的作者和支持者在这里回答问题或对事物进行评论。@Kuan:.和当然,我可以推荐并感谢您,then/catch创建的承诺是否与我的案例中其他AsyncThing()返回的承诺相同?不。每个
then/catch
都创建了一个新的承诺。每个
then
回调都在
nextTick
上运行,因此它甚至不是一个同步操作。阅读规范,它非常方便:)同样在您的情况下,
someOtherAsyncThing
promise在调用
catch
方法时甚至不存在。请记住,调用
then/catch
是一个同步操作,而克隆promise是一个异步操作。我不理解术语“bubble”或“contain”。
promise1=promise.then(()=>promise2)在这里你可以说
promise1
contains
promise2
,因为
promise1
必须等待
promise2
解决后才能解决。也许“contains”不是这里最好的词,但对我来说,这就是视觉上的情况。冒泡类似于DOM中的冒泡。
Promise1 <= Promise2.catch(e) <= Promise3 <= throw
^ resolves  ^ rejects            ^ rejects
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.
a().then(function() {
  return b().catch(function() {
    console.log('boo');
  });
}).catch(function(error) {
  console.log('oh no', error);
});