gpt4 book ai didi

异步函数的 JavaScript 回调 : is there any pattern to differentiate between "return value" and "exception"?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:30 24 4
gpt4 key购买 nike

作为 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);
});

执行此操作的最佳(也许是常见)方法是什么?

谢谢。

最佳答案

我自己一直在使用三种主要方法:

  1. 将“错误”参数传递给回调。
  2. 有一个“错误”回调。这通常与 (1) 结合使用。
  3. 拥有某种全局异常管理器。

我将从第三个开始。我们的想法是拥有一个对象,该对象将允许分派(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com