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
containspromise2
,因为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);
});