相关疑难解决方法(0)

抛出字符串而不是错误

既然我们可以throw在Javascript中使用关键字抛出任何内容,那么我们不能直接抛出错误消息字符串吗?

有谁知道这有什么捕获?

让我为此添加一些背景:很多时候,在JavaScript世界中,人们依赖于参数检查而不是使用try-catch机制,所以只抛出致命错误才有意义throw.仍然,为了能够捕获一些系统错误,我必须为我自己的错误使用不同的类,而不是创建Error的子类,我想我应该只使用String.

javascript

64
推荐指数
4
解决办法
2万
查看次数

是应该拒绝承诺错误或字符串?

我正在编写一个在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)

javascript promise

19
推荐指数
1
解决办法
3629
查看次数

如果我拒绝承诺具有另一个Promise值,会发生什么?

如果使用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值拒绝(而不是解决)会发生什么.拒绝过程是否也消耗中间承诺,还是通过完整传递?

如果它确实消耗它们,那它是如何工作的?

javascript promise

5
推荐指数
2
解决办法
1071
查看次数

为什么新 Promise 的 reject() 在可怕的“Uncaught (in 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)

javascript es6-promise angular

5
推荐指数
1
解决办法
933
查看次数

拒绝承诺未定义

我试过下面的函数使用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)

javascript generator node.js promise co

0
推荐指数
1
解决办法
8779
查看次数

标签 统计

javascript ×5

promise ×3

angular ×1

co ×1

es6-promise ×1

generator ×1

node.js ×1