【发布时间】:2016-04-23 01:05:25
【问题描述】:
我注意到在 Parse for React Native 中的一系列承诺中抛出异常时发生了一些非常奇怪的事情。承诺链永远不会解析,永远不会拒绝,也永远不会抛出异常。它只是默默地消失了。
这里是重现问题的示例代码:
// Replacing this with Promise.resolve() prints the error.
// Removing this stage prints the error.
Parse.Promise.as()
// Removing this stage causes a red screen error.
.then(function() {
// Replacing this with Parse.Promise.as() causes a red screen error.
return Promise.resolve();
})
.then(function () {
throw new Error("There was a failure");
})
.then(function () { console.log("Success")}, function (err) { console.log(err) });
正如您从 cmets 中看到的,它似乎只发生在这个特定的事件序列中。移除一个阶段,或者将 Parse 承诺换成原生 JS 承诺,会导致事情再次发生。 (在我的实际代码中,“Promise.resolve()”阶段实际上是对返回 Promise 的原生 iOS 方法的调用。)
我知道 Parse Promise 的行为完全不像 A+ 兼容的 Promise(参见https://stackoverflow.com/a/31223217/2397068)。事实上,在这段代码之前调用Parse.Promise.enableAPlusCompliant() 会导致异常被捕获并打印出来。但我认为 Parse Promise 和原生 JS Promise 可以安全地一起使用。
为什么这个异常会无声无息地消失?
谢谢。
【问题讨论】:
-
您可能已经回答了自己的问题。 @Bergi 的 accepted answer 表示 Parse 承诺不符合 A+ 默认情况下,并且第一个代码审查点说,在使它们符合标准之后“然后回调中的异常被捕获并导致结果被拒绝承诺,而不是全局错误”。看来您可以同时使用 Parse 和 JS 承诺提供您首先使 Parse 承诺兼容。
-
Parse.Promise.as(true).then(function() { return Parse.Promise.error("here is an error"); }).then(function(done) { console.log('done', done); }, function(err) { console.log('err', err); });也可以捕获错误.. -
@zangw 感谢 Parse 原生替代方案。我试图解释为什么 Promise.resolve 可以解决以下很多问题:-)
-
@Traktor53 我知道,当它们符合 A+ 标准时,“异常......被捕获,而不是全局错误”,但我在这里报告的问题涉及异常完全消失! IE。没有全局错误。
-
@zangw 感谢您提供的有用提示!不幸的是,在我的实际代码中,异常是在第三方代码中引发的,我不能将其更改为被拒绝的承诺(不将其包装在 catch 块中,或嵌套另一个承诺,这对我来说违背了链接承诺的目的首先!)。
标签: javascript parse-platform promise react-native