相关疑难解决方法(0)

如何在Promise中捕获未捕获的异常

有没有办法全局捕获所有异常,包括Promise异常.例:

    window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
        alert("Error occured: " + errorMsg);//or any message
        return false;
    }

    var myClass = function(){

    }


    var pr = new Promise(function(resolve, react){
        var myInstance = new myClass();
        myInstance.undefinedFunction(); // this will throw Exception
        resolve(myInstance);
    });


    pr.then(function(result){
        console.log(result);
    });

    // i know right will be this:
    // pr.then(function(result){
    //     console.log(result);
    // }).catch(function(e){
    //     console.log(e);
    // });
Run Code Online (Sandbox Code Playgroud)

这个脚本会默默地死掉而不会出错.萤火虫没什么.

我的问题是,如果我犯了一个错误,忘了抓住它有没有办法在全球范围内捕捉到它?

javascript exception promise

68
推荐指数
3
解决办法
6万
查看次数

在Angular 1.6中可能无法处理拒绝

我有一个AngularJS代码:

service.doSomething()
  .then(function(result) {
      //do something with the result
  });
Run Code Online (Sandbox Code Playgroud)

在AngularJS 1.5.9中,当我在该.then()部分中有错误时:

service.doSomething()
  .then(function(result) {
      var x = null;
      var y = x.y;
      //do something with the result
  });
Run Code Online (Sandbox Code Playgroud)

我收到明确的错误消息:

TypeError:无法读取null的属性"y"

但是在版本1.6中使用相同的代码我得到了一个不同的错误:

可能是未处理的拒绝:{}未定义

我知道这与此更改有关,通过添加.catch()块,单个解决方案非常简单:

service.doSomething()
  .then(function(result) {
      var x = null;
      var y = x.y;
      //do something with the result
  })
  .catch(console.error);
Run Code Online (Sandbox Code Playgroud)

现在我再次拥有我想要的东西:

TypeError:无法读取null的属性"y"

但是如何在不在.catch()每个地方添加块的情况下为整个应用程序获得相同的结果(更详细的错误)?

我测试了建议的解决方案,通过添加:

$qProvider.errorOnUnhandledRejections(false);
Run Code Online (Sandbox Code Playgroud)

但有了这种情况甚至更糟 - 我在控制台中没有任何东西!错误被某处吞没,根本没有记录.我不确定AngularJS 1.6或我的配置是否有问题.

您是否有任何想法如何从1.5.9版"恢复"日志记录行为?

编辑:

添加定制错误处理程序

.factory('$exceptionHandler', function($log) {
  return function(exception, cause) {
    $log.warn(exception, …
Run Code Online (Sandbox Code Playgroud)

javascript angularjs angular-promise angular-providers angularjs-1.6

29
推荐指数
4
解决办法
5万
查看次数

在setTimeout中使用async有效吗?

我在Javascript中有一个异步函数,我添加了setTimeout.代码看起来像这样:

        let timer;
        clearTimeout(timer);
        timer =setTimeout(() => {
        (async() => {
            await this._doSomething();
        })();
        }, 2000);
Run Code Online (Sandbox Code Playgroud)

setTimeout的puprose是在运行函数之前加2秒.确保用户停止输入.

我现在应该从此函数中删除async/await,因为setTimeout是异步的吗?

任何帮助在这里非常感谢!

javascript asynchronous settimeout ecmascript-2017

16
推荐指数
1
解决办法
1万
查看次数

如何使用node.js中的本机promise来全局处理异常?

我知道如何处理promises中的特定错误但我有时会看到如下代码片段:

somePromise.then(function(response){
    otherAPI(JSON.parse(response));
});
Run Code Online (Sandbox Code Playgroud)

有时,我得到无效的JSON,这会在JSON.parse throws 时导致静默失败.一般来说,我必须记住.catch在我的代码中为每个承诺添加一个处理程序,当我不在时,我无法找到我忘记的地方.

如何在代码中找到这些被抑制的错误?

node.js promise es6-promise

8
推荐指数
1
解决办法
2094
查看次数

为什么“unhandledrejection”无法捕获 JSON.parse() 的错误?

我尝试从 抛出一个错误JSON.parse(),我希望“unhandledrejection”事件会捕获它:

window.addEventListener('unhandledrejection', event => {
  console.log('unhandledrejection:', event.reason?.message || event.reason);
});

Promise.resolve("{")
  .then((data) => {
    JSON.parse(data)
  });
Run Code Online (Sandbox Code Playgroud)

但是(Chrome 的)控制台中出现 Uncaught (承诺):

Uncaught (in promise) SyntaxError: Unexpected end of JSON input
  at JSON.parse (<anonymous>)
  ...
Run Code Online (Sandbox Code Playgroud)

我尝试了更多抛出错误的方法,它们都可以被捕获:

Uncaught (in promise) SyntaxError: Unexpected end of JSON input
  at JSON.parse (<anonymous>)
  ...
Run Code Online (Sandbox Code Playgroud)

我试图重新抛出错误,但它仍然无法被“unhandledrejection”捕获:

window.addEventListener('unhandledrejection', event => {
  console.log('unhandledrejection:', event.reason?.message || event.reason);
});

Promise.resolve("{")
  .then((data) => {
    eval(data)
  }); // unhandledrejection: SyntaxError: Unexpected end of input

Promise.resolve()
  .then(() => {
    throw 123
  }); …
Run Code Online (Sandbox Code Playgroud)

javascript promise unhandled-promise-rejection

6
推荐指数
0
解决办法
717
查看次数

JavaScript错误未显示在控制台中?

fields在以下代码中未定义,但在发生错误时它不会记录到控制台.在这个具体的例子中,为什么以及实际处理这个问题的方法是什么?

"Testing"记录到控制台(第2行),但未报告未定义的变量fields(第4行).错误在API响应(第5行)中返回,但没有相关信息,如行#,堆栈跟踪等.

如何将此日志中的错误发送到控制台,为什么不是?

export function post(req, res) {
  console.log("Testing")
  User.create( getFields(req, ["name_first", "name_last"]) )
    .then(user =>  respondJSON (res, fields, { status: 201 }))
    .catch(err => respondError (res, err))
}
Run Code Online (Sandbox Code Playgroud)

由于catch响应错误,我得到以下API响应:

{
  "error": true,
  "data": {
    "message": "fields is not defined"
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用Babel 6和babel-node通过NPM脚本运行我的代码.我也在使用摩根伐木.删除用于记录的中间件不会改变错误输出.

javascript node.js express ecmascript-6

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

如何通过worker.onerror在promise中冒泡web worker错误?

我正在处理一个需要报告错误发生的网络工作者.通常,我可以worker.onerror用来监听从工作者抛出的任何错误.但是,当错误发生在Web工作者的承诺中时,我无法弄清楚如何将错误重新发送回来worker.onerror.

请原谅奇怪的代码片段,因为这似乎是证明工人行为的唯一方法.(工作人员在HTML部分中定义).

function getInlineJS() {
  var js = document.querySelector('[type="javascript/worker"]').textContent;
  var blob = new Blob([js], {
    "type": "text\/plain"
  });
  return URL.createObjectURL(blob);
}

var worker = new Worker(getInlineJS());

worker.onerror = function(err) {
  document.getElementById('errors').innerHTML += 
    "error " + err.message + '\n';
}

worker.onmessage = function (msg) {
  console.log("message recieved", msg);
  document.getElementById('messages').innerHTML += 
    "message " + msg.data + '\n';
}


worker.postMessage("run");
worker.postMessage("promise");
Run Code Online (Sandbox Code Playgroud)
should write "Normal Error and In Promise Error" below and in console (promise error only occurs in console …
Run Code Online (Sandbox Code Playgroud)

javascript web-worker es6-promise

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

为什么在JS中使用异常来拒绝承诺?

我所指的规范是http://promises-aplus.github.io/promises-spec/.

使用时then(),您可以返回一个承诺,并在您希望时拒绝承诺,或者您可以抛出异常拒绝承诺.

为什么api不是以这种方式设计的,对于then函数来说,它是像原始的promise构造函数一样传递一个解析和拒绝函数?

许多语言中的异常都很繁重(我也假设在javascript中),所以看起来很奇怪他们将它们用作流控制的选择.创建一个全新的promise对象并返回它,只是为了拒绝它,增加了代码膨胀IMO.如果抛出异常(例如语法错误,或者在未定义的对象上调用函数等),调试也会变得更难.

javascript promise

4
推荐指数
1
解决办法
1883
查看次数

从 handleSubmit 函数抛出 redux-form 提交错误

我有一个 redux-form,它有一个 handleSubmit 函数,我用它来进行一些异步 http 服务器身份验证。如果由于某种原因身份验证失败,我想抛出一个 redux-form 错误。如果我抛出“SubmissionError”,我会收到一条错误消息:Uncaught (in promise)

我的代码:

class MyLoginForm extends Component {
    handleSubmit({ email, password }) {
        axios.post("http://API_SERVER/login", null, { withCredentials: true, auth: { username: email, password: password } })
            .then((response) => {
                console.log('HTTP call success. JWT Token is:', response.data);
            })
            .catch(err => {
                console.log(err)
	>>>>	WHAT TO DO TO CONVEY THE ERROR IN THE REDUX-FORM <<<<
                if (err.response) {
                    
                    if (err.response.status !== 200) {
                        console.log("Unexpected error code from the API server", err.response.status);
                        throw new …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs redux redux-form

3
推荐指数
1
解决办法
1355
查看次数

从父承诺中解决一系列承诺

这是我对嵌套诺言的第一枪。我使用的是bluebird库,但我认为对于所有的Promise库都是相同的。

从高层次上讲,这就是我想要做的:

myService.getSomeData(url)
 .then((data) => {
   myOtherService.getMoreData(data.uniqueId)
   .then((thisDataIsAnArray) => {
      //loop over the data above and do something
   });
 });
Run Code Online (Sandbox Code Playgroud)

getMoreData()应该进行X次服务调用并将结果存储在X个元素数组中。这是我开始迷路的地方,因为我不确定如何制作此方法以及应该从中得到什么。我已经在蓝鸟那里taken了几口Promise.allPromise.map但是却挣扎了,以为我会征求建议。

javascript promise bluebird

2
推荐指数
1
解决办法
1346
查看次数