gpt4 book ai didi

exception - Dojo - 吞下 Promise 中的 ReferenceError 异常

转载 作者:行者123 更新时间:2023-12-03 08:03:48 25 4
gpt4 key购买 nike

在 jQuery 中,如果您在 ajax 回调方法中出错,您将收到正确的控制台错误消息和堆栈跟踪。

$.get("https://api.github.com/users/octocat/orgs", function() {
var a = FAIL;
});

然而,在使用 dojo/request/xhr 的 dojo 中,这些愚蠢的错误似乎被完全吞没了。当我运行它时,我的控制台中唯一的东西是“然后”和“总是”。
require(["dojo/request/xhr" ], function(xhr) {
var promise = xhr.get("https://api.github.com/users/octocat/orgs");
promise.then(function(data) {
console.log('then');
var a = FAIL;
console.log('goodbye');
}, function() {
console.log('error');
});
promise.otherwise(function() {
console.log('otherwise');
});
promise.always(function() {
console.log('always');
});
});

使用已弃用的 dojo.xhrGet,问题得到了非常轻微的改善。我收到一条控制台错误消息,并调用了我的错误处理程序,但它只显示“ReferenceError {}”并为我提供了一个从不指向我拥有的函数的堆栈跟踪:
dojo.xhrGet({
url: "https://api.github.com/users/octocat/orgs",
load: function() {
console.log('dojo.xhrGet.load');
var a = FAIL;

console.log('goodbye dojo.xhrGet.load');
},
error: function() {
console.log('dojo.xhrGet.error');
},
handle: function() {
console.log('dojo.xhrGet.handle');
}
});

在编写程序时我们会犯错误,很高兴我们有像 chrome 开发者工具这样的工具来指出这些错误。当您可以看到堆栈跟踪和错误消息时,发现错误所需的时间显然比没有收到反馈要快得多。我在道场没有得到任何反馈,我不敢相信这样一个受欢迎的图书馆能以这种方式运作。我究竟做错了什么?

最佳答案

对从 jQuery 继承的 Promise 的理解与其他人(检查 Promises/a+ 实现)的理解完全不同。对于这个答案的其余部分,我将讨论 promises/a+ 兼容的 promises。 Dojo 的 Deferred 实际上不符合 a+ 标准,但它足够接近,以至于我在这里讨论的所有内容都同样适用。

Promise 是不可变的,您不能通过调用 then 来更改 Promise 状态.一个 promise 代表一个最终的值(value),如果能够通过说“一旦值(value)准备好,就这样做”来改变 promise 是荒谬的。

因此,希望这可以解释为什么不调用错误处理程序,但是捕获错误的基本思想仍然是完全可能的。您只需要使用返回值。当您调用 then在一个 promise 上,它返回一个新的(几乎总是)不同的 promise 。这个新的 Promise 非常特殊,如果原始的 Promise 被解析,并且你传递的成功处理程序被调用,并且返回一些东西,那么这个东西将是第二个 Promise 的解析值。

同样,如果错误处理程序(在第一个 promise 上)被触发,并且该函数返回一些东西,那么这个东西将是第二个 promise 的分辨率值。抛出的错误也是如此,它们被传递给错误处理程序(第二个 promise !)。

所以这是你的第一个代码示例,它以更多的 promises/a+ 方式编写:

require(["dojo/request/xhr" ], function(xhr) {
var promise = xhr.get("https://api.github.com/users/octocat/orgs");
promise.then(function(data) {
console.log('then');
var a = FAIL;
console.log('goodbye');
}, function() {
console.log('error');
}).then(null, function() {
console.log('otherwise');
});

promise.always(function() {
console.log('always');
});
});

我真的不明白你想用 always 函数做什么,所以我不知道把那个放在哪里。关于调用堆栈,我建议查看 Q Promise 库,它具有非常先进的异步调用堆栈支持。

关于exception - Dojo - 吞下 Promise 中的 ReferenceError 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com