既然我们可以throw在Javascript中使用关键字抛出任何内容,那么我们不能直接抛出错误消息字符串吗?
有谁知道这有什么捕获?
让我为此添加一些背景:很多时候,在JavaScript世界中,人们依赖于参数检查而不是使用try-catch机制,所以只抛出致命错误才有意义throw.仍然,为了能够捕获一些系统错误,我必须为我自己的错误使用不同的类,而不是创建Error的子类,我想我应该只使用String.
我正在编写一个在Javascript中大量使用类似ECMAScript 6的承诺的代码.
我无法决定,如果用字符串或错误拒绝承诺更"正确",因为我已经看到使用了这两种模式.
也就是说,如果最好打电话
return new Promise(response, reject) {
reject("Sky is falling.");
}
Run Code Online (Sandbox Code Playgroud)
要么
return new Promise(response, reject) {
reject(new Error("Sky is falling."));
}
Run Code Online (Sandbox Code Playgroud) 如果使用Promise p(或Thenable)的值解析Promise q,它实际上将成为Promise的副本q.如果q已解决,p将以相同的值解析.
Promise.resolve(Promise.resolve("hello"));
Run Code Online (Sandbox Code Playgroud)
Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "hello"}
Run Code Online (Sandbox Code Playgroud)
如果q被拒绝,p将被拒绝具有相同的值.
Promise.resolve(Promise.reject(new Error("goodbye")));
Run Code Online (Sandbox Code Playgroud)
Promise {[[PromiseStatus]]: "rejected", [[PromiseValue]]: Error: goodbye}
Run Code Online (Sandbox Code Playgroud)
Promise p通过Promise解决/拒绝的事实q,而不是直接与相应的价值相关,这与最终结果无关.中间Promise作为解决过程的一部分被消费,并且对消费者不可见.
如果q是永不解决或拒绝,p也将永远保持待定.
Promise.resolve(new Promise(() => null)); // perpetually-pending promise
Run Code Online (Sandbox Code Playgroud)
Promise {[[PromiseStatus]]: "pending", [[PromiseValue]]: undefined}
Run Code Online (Sandbox Code Playgroud)
这些案例众所周知,但我从未见过如果Promise被另一个Promise值拒绝(而不是解决)会发生什么.拒绝过程是否也消耗中间承诺,还是通过完整传递?
如果它确实消耗它们,那它是如何工作的?
在 Angular 的 github 问题、谷歌或这里在 stackoverflow 上搜索“Uncaught (in promise)”会产生很多非常具体的结果,但我的问题更广泛一些(而且由于结果的扩散,我不知道这是否是重复的)
前提:在我的代码中的某个地方,我有一个未捕获的承诺拒绝(Angular 4.4.4)
案例:
案例 1:简单拒绝
在我的组件中:
ngOnInit() {
Promise.reject("foo");
}
Run Code Online (Sandbox Code Playgroud)
在控制台中产生这个(太好了,我可以看到它来自哪里):
ERROR Error: Uncaught (in promise): foo
at resolvePromise (zone.js:824)
at Function.ZoneAwarePromise.reject (zone.js:903)
at MyComponent.webpackJsonp.../../../../../src/app/component/my.component.ts.MyComponent.ngOnInit (my.component.ts:nn)
Run Code Online (Sandbox Code Playgroud)
案例二:new Promise,抛出错误
在我的组件中:
ngOnInit() {
new Promise((resolve, reject) => {
throw new Error("foo");
}).then(() => {
console.log("ain't gonna happen");
});
}
Run Code Online (Sandbox Code Playgroud)
在控制台中产生这个(更好的是,当场给出位置):
ERROR Error: Uncaught (in promise): Error: foo
Error: foo
at my.component.ts:nn
at new ZoneAwarePromise (zone.js:890)
at MyComponent.webpackJsonp.../../../../../src/app/component/my.component.ts.LMyComponent.ngOnInit (my.component.ts:nn)
Run Code Online (Sandbox Code Playgroud)
这也适用于链接,例如以下在控制台中或多或少地给出相同的堆栈跟踪。
ngOnInit() {
const promise3 …Run Code Online (Sandbox Code Playgroud) 我试过下面的函数使用co和javascript promise测试,fulfill会成功返回但是reject没有,并且捕获错误未定义.并且流程无法继续.为什么?
错误:
> at GeneratorFunctionPrototype.next (native)
at onFulfilled (/Users/../project/app/node_modules/co/index.js:65:19)
at runMicrotasksCallback (node.js:337:7)
at process._tickDomainCallback (node.js:381:11)
Run Code Online (Sandbox Code Playgroud)
码:
domain.run(function() {
var testPromise = function() {
return new Promise(function (fulfill, reject){
//reject('error');
reject(new Error('message'));
});
};
co(function *() {
var d = yield testPromise();
console.log(d);
res.send('fin');
}).catch(onerror);
function onerror(error) { console.error(error.stack); }
});
domain.on('error', function(error) { console.error(error); });
Run Code Online (Sandbox Code Playgroud)