- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
作为 Javascript 的新手,我很困惑哪种可能是区分异步函数计算的结果和任何异常/错误的最佳方法。如果我是对的,在这种情况下你不能使用 try-catch 作为被调用函数在回调之前结束,而后者实际上可能抛出异常。
嗯。
到目前为止,我已经看到一些库函数需要回调,例如:function(err, result)
。因此,在使用 result
之前必须测试 err
。
我还尝试自己返回实际结果或错误对象。此处,回调的形式为 function(result)
并且你必须在使用它之前测试 result instanceof Error
。它遵循一个这样的例子:
function myAsyncFunction ( callBack ) {
async_library_function( "some data", function (err, result) {
if (err) { callBack ( new Error ("my function failed") ); return; }
callBack ( some calculation with result );
});
} // myFunction ()
//
// calling myFunction
//
myAsyncFunction ( function (result) {
if (result instanceof Error ) { log ("some error occurred"); return; }
log ("Alright, this is the result: " + result);
});
执行此操作的最佳(也许是常见)方法是什么?
谢谢。
最佳答案
我自己一直在使用三种主要方法:
我将从第三个开始。我们的想法是拥有一个对象,该对象将允许分派(dispatch)错误并在全局范围内捕获它们。像这样:
var ErrorManager = {
subscribers: [],
subscribe: function (callback) {
this.subscribers.push(callback);
},
dispatchError: function (error) {
this.subscribers.forEach(function (s) {
s.apply(window, [ error ]);
});
}
}
这对于给定的情况来说是非常具体的,因为基本上没有简单的方法来跟踪错误的来源,而且很容易搞砸。例如,如果您需要隐藏一个内容加载失败的对话框,您必须将此信息(例如对话框 ID/元素)传播给所有订阅者。
当您想执行不改变(或改变独立部分)Web 应用程序(例如,显示状态栏或消息到控制台)的操作时,上述方法很好).
第二种方法基本上将成功的调用与失败的调用区分开来。例如:
$.ajax('/articles', {
success: function () { /* All is good - populating article list */ },
error: function () { /* An error occured */ }
});
在上面的示例中,success
回调不会在失败的情况下执行,因此如果您希望某些默认行为始终触发,则需要在两个回调之间进行同步或者有一个总是被调用的回调(对于上面的例子 - complete
)。
我个人更喜欢第一种方法 - 在回调中传递错误对象和潜在结果。这消除了必须“跟踪”错误的来源/上下文以及担心清理过程(默认行为)的问题。所以,像你提供的东西:
function beginFetchArticles(onComplete) {
$.ajax('/articles', {
complete: function (xhr) {
onComplete(xhr.status != 200 ? xhr.status.toString() : null,
$.parseJSON(xhr.responseText)); /* Something a bit more secure, probably */
}
});
}
希望这对您有所帮助。
关于异步函数的 JavaScript 回调 : is there any pattern to differentiate between "return value" and "exception"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19430617/
我在 Xcode 中安装了 TensorFlow 工具链,并尝试运行来自 S4TF GitHub 页面的示例片段。我收到以下错误: JVP does not exist. Differential-f
我在 Xcode 中安装了 TensorFlow 工具链,并尝试运行来自 S4TF GitHub 页面的示例片段。我收到以下错误: JVP does not exist. Differential-f
我想在 Modelica 中建模一个显式时间相关的微分方程。 说我想建模 Real x(start=1); der(x) = t; 在 Modelica 中。访问时间变量 t 的正确方法是什么? 最佳
我正在处理 CDA 文档。我能够根据 CDA 模式验证 XML 文档,并找出 xml 是否为 CDA。但如果是 CDA,则有两类 CDA 文件。 结构化 CDA(人类可读文本) 非结构化 CDA(嵌入
我正在处理 CDA 文档。我能够根据 CDA 模式验证 XML 文档,并找出 xml 是否为 CDA。但如果是 CDA,则有两类 CDA 文件。 结构化 CDA(人类可读文本) 非结构化 CDA(嵌入
我在 Maxima 中有一个微分方程组。我正在尝试绘制解决方案。 diff_eq1: 'diff(p(t),t) = (5/2 + (3^(1/2))/24 - (5/8)*p(t) - ((3^(1
我正在添加两个 Leaflet Draw 实例( https://github.com/Leaflet/Leaflet.draw ),如下所示(仅使用线条): var drawControl = ne
我有一些代码,我将在其中接收未知类型的对象。它可以是 NSString、NSNumber、包裹在 NSValue 或其他类中的标量: -(void) doSomethingWith:(id) valu
Andrei Alexandrescu 撰写的“编写快速代码 I”大约 39 分钟 (link here to youtube) 有一张关于如何使用差分计时的幻灯片......有人可以用这种方法向我展
我有一个使用 Google Chart 显示时间表的脚本,但是我无法修改它以显示差异图表。 我只需计算两个值之间的差值并显示它,而不是总数。我有 [12, 3000, 2500], [15, 4700
我想从张量生成掩码。例如: import numpy as np import tensorflow as tf input = tf.Variable(np.array([[0, 0.1], [0.
是否有可靠的方法使用 HttpServletRequest 分别提取 GET 和 POST 参数? 也就是说,将查询字符串 (GET) 中发送的参数与请求正文 (POST) 中发送的参数区分开来,假设
HTTP 状态代码 503 是 described in rfc2616当服务器“由于服务器的临时过载或维护而当前无法处理请求”时是相关的。 在某些情况下,应用程序可能会因维护而停机。在某些情况下,应
有没有用DifferentialEquations.jl编码的所有微分方程式的存储库(或网页),或者至少在EveryaryDiffEq.jl中编码的ODE?。如果没有存储库,有没有其他来源、大学课程等
我需要为最近的项目使用多个工作区。每个工作区可能包含 10 个或更多项目。 当我在各种应用程序和不同的 Eclipse 实例(对于多个工作区)之间切换时,我希望能够轻松区分给定的工作区,而不必花 5
我有一个生产服务器和一个临时服务器,在将新功能转移到生产之前,在其中测试新功能。临时服务器在物理上与生产服务器不同(不同的主机具有不同的 url),但它尽可能地模仿它(即相同的包、相同的 gem 等)
我是 angular 的新手,并尝试执行以下操作: {{element}}
我正在使用 - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id ) annotation{ 为自定义图钉
根据导致异常的原因的不同,建议分别处理相同类型异常的建议方法是什么? 假设有人希望以不同方式处理以下AttributeError的以下两个实例: 'str' object has no attribu
这是为了自学 N 维线性齐次常微分方程组的形式: dx/dt=Ax 其中 A 是系统的系数矩阵。 我了解到,您可以通过确定 A 的所有特征值的实部是否为负来检查稳定性。如果存在 A 的任何纯虚特征值,
我是一名优秀的程序员,十分优秀!