Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不同数据结构的ajax错误处理方法_Javascript_Ajax_Angularjs - Fatal编程技术网

Javascript 不同数据结构的ajax错误处理方法

Javascript 不同数据结构的ajax错误处理方法,javascript,ajax,angularjs,Javascript,Ajax,Angularjs,我想使用两个或三个模块来显示错误,但是我有许多不同的错误数据结构作为ajax的响应。应避免每个ajax错误回调或每个错误显示模块的重复if/else链。以下是我收到的一些错误响应示例,这些错误响应以属性的形式显示给用户: 500 Server Error: { ... Message: "An error has occurred.", ... } 401 Login Error: { ... Reason: "Invalid login credent

我想使用两个或三个模块来显示错误,但是我有许多不同的错误数据结构作为ajax的响应。应避免每个ajax错误回调或每个错误显示模块的重复if/else链。以下是我收到的一些错误响应示例,这些错误响应以属性的形式显示给用户:

500 Server Error: {
    ...
    Message: "An error has occurred.",
    ...
}

401 Login Error: {
    ...
    Reason: "Invalid login credentials.",
    ...
}

400 Bad Request on Put: {
    Errors: [
        {
            PropertyName: "EmailAddress",
            ErrorName: "Invalid email address."
        }
    ]
}

目前,我正在考虑通过angular中的
$httpProvider.interceptors
(类似于jQuery中的ajaxSetup?)获取每个错误响应,并强制每个错误响应具有一致的属性名称。我不知道这是否是一个糟糕的设计,但它肯定会让事情变得更简单。

解决这个问题的几种方法之一是使用两个概念:

单一责任原则:

很明显,你可以把所有的东西都混在一起,然后让它工作起来。在我的评论中,我建议使用适配器模式,但在回答这个问题时,我意识到wan还不够好。如果是这样,您的应用程序或应用程序仍将有一部分代码负责选择适配器,因此我们可以将其封装到一个工厂中,为您提供合适的适配器:

因此,我们将有三个主要组成部分:

  • 应用程序:负责应用程序逻辑,获取错误对象并将其传递给
  • 工厂:负责分析错误对象并确定哪种适配器满足需要
  • 适配器:负责处理错误,并独立于内部格式以统一的方式处理错误
在JavaScript中,这可能类似于:

function serviceResponse(error, response) {

  // assuming error could be all different shapes and sizes
  if (error) {

    adaptorFactory
      .getAdaptor(error)
      .process(error)    
  }

  // your valid response logic

} 
适应新错误格式的未来更改

如果出现新错误,则必须进行两项更改:在工厂中创建一个新的适配器对象和一个新的
If/else
。但它的美妙之处在于,您根本不会触及应用程序逻辑。
serviceResponse
方法保持原样

同样,有很多好的解决方案,这只是一种方法。只要保留关键概念,就可以根据需要开发适配器和工厂。我的例子只是为了举例说明


希望这能有所帮助。

找出您希望如何处理错误处理,然后使用a将您的响应转换为您开发的适当对象/API。听起来不错,我以一种不太引人注目的方式实现了它,但一切都简化了。这似乎是解决这类问题的常见方法。如果您将此评论作为答案提交,我将确认这是答案。我一直在以非常线性的方式将它们混合在一起,但您说的应该有更小的独立进程是正确的。这将使以后的事情更易于维护。我很快会再看一眼(我有一个相关的bug要修复)。再次感谢。