【问题标题】:Error-handling try & catch + callback? [duplicate]错误处理 try & catch + 回调? [复制]
【发布时间】:2012-08-25 13:20:50
【问题描述】:

可能重复:
Is it possible to catch exceptions thrown in a JavaScript async callback?

我正在从数据库中提取订单然后请求,我希望能够打破forEach,我可以使用trycatch 来做到这一点,但我认为回调不起作用

try{
    orders.find().forEach(function(order){
        request({
            "method":"get",
            "json":true
        },function (error, response, data){
            if (!error && response.statusCode == 200) {
                console.log("Order id "+order.id);
            }else{
                throw "limit";
            }
        });
    });
}catch(err){
    if(err == "limit"){
        console.log("error occured");
    }
}

这就是我得到的

    /Users/thomas/Desktop/forerunner/retrieveTransactions.js:120
                throw "limit";
                ^
    limit

我只想:

    error occured

【问题讨论】:

  • @pimvdb 不一样,因为forEach
  • 答案大致相同:不可能。这实际上是有道理的,因为 ajax 的完成晚于 forEach 结束。
  • 如果要停止迭代,只需在调用orders.find()之前声明一个标志,并在遇到错误时设置它。任何后续处理程序都可以查询它并返回。如果接口支持,也可以使用some(),只要处理程序返回true就停止处理。

标签: javascript error-handling


【解决方案1】:

你需要在回调函数中添加try-catch,比如:

orders.find().forEach(function(order){
    request({
        "method":"get",
        "json":truetry{
    },function (error, response, data){
        try{
            if (!error && response.statusCode == 200) {
                console.log("Order id "+order.id);
            }else{
              throw "limit";
            }
        }catch(err){
            if(err == "limit"){
                console.log("error occured");
            }
        }
    });
});

【讨论】:

  • 这不会破坏forEach 并且也有点矫枉过正。只需将代码放在else 块中即可。
  • 它现在确实有效
猜你喜欢
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多