Javascript承诺和回调函数

时间:2015-05-30 01:24:10

标签: callback promise q

所以基本上任何人都可以简单地跟我说说

之间有什么区别
user.login(username,password,function(){
    //do something here
});

user.login(username,password).then(function(){
    //do something here
});

哪一个应该使用,有什么好处?我想到了关于javascript promises和回调函数的这个话题。

谢谢!

2 个答案:

答案 0 :(得分:0)

这取决于user.login()的工作方式。如果它的设计使得第三个参数是一个将在登录完成时调用的回调函数,那么您将使用第一个表单(并且您可能必须检查发送给回调的err参数)。

如果user.login()旨在返回在登录完成时将履行的承诺,那么您将使用第二种形式(并且您可能希望添加错误处理程序回调)。

如果它被设计为具有两种行为(如果传递了则总是返回一个promise并调用一个回调),那么你可以选择任一种方法。

如果设计user.login()使其中任何一个都有效,那么带有promise的第二个结构更具可扩展性,因为你可以利用promises的许多优点:

  1. 更容易链接/排序多个异步操作。
  2. 在回调中投掷安全
  3. 使用Promise.all()等内容更轻松地将此异步操作与其他异步操作进行协调。
  4. 更强大的错误处理 - 错误将在promises中传播,但不会在回调中传播。
  5. 如果您曾编写过包含大量异步操作的代码,其中一些是顺序的,其中一些是并行的,其中一些必须与其他一些协调,这些代码需要要有强大的错误处理(例如在服务器环境中),您将非常非常快速地发现承诺可以使您更轻松地完成目标。而且,一旦你学会了它们,你会发现它们甚至更适合于简单的情况。

    如果您曾经编写过需要执行大量异步操作的代码,并且需要在完成所有异步操作时对所有返回的数据进行操作,则承诺会使代码变得微不足道。没有承诺,你必须自己编写很多脚手架代码来跟踪数据并跟踪所有内容何时完成,并以某种方式传播错误(如果发生)。

答案 1 :(得分:0)

如果你问的是“哪种设计更好?” (假设login()尚未实现)Promises是一个整体更具可扩展性的架构。

如果有人编写了函数的第一个版本,他们必须确保回调不为null。此外,更改回调值更难;如果请求失败,则更难捕获异常。 (并没有多少人倾向于在他们的函数中添加一个“onError”回调函数,但如果你要返回一个promise对象,那就更容易了)一般来说,如果两者都可用,我会尽可能保留承诺形式的承诺。