4

我正在尝试研究如何以不同的风格进行 JavaScript 回调。

我目前的回调风格,将回调传递给函数,函数调用回调。例如:

函数调用

doSomething(function(data){
   console.log(data);
});

功能

function doSomething(callback) {
    // Call the callback
    callback("someData");
}

这是我正在使用的当前回调样式。但我见过以不同风格进行回调的库。例如:

函数调用

doSomething().success(function(data){
   console.log(data);
});

这是如何工作的,有人可以为我概述一个简单的例子吗?谢谢你的时间。

4

3 回答 3

4

那是 Promise 库的一个实现。jQuery有一个称为 deferreds 的实现,另一个是Q

doSomething看起来像这样,使用 jQuery。

function doSomething() {
   var dfd = $.deferred();
   // do your logic
   // eventually call dfd.resolve();
   return dfd.promise();
}

然后调用它,使用

doSomething().then(function() {
   // do something else
});

这种模式的好处是可以有多个回调和错误回调。

于 2013-07-12T10:49:30.553 回答
3

您描述的样式通常称为承诺。jQuery 有 Promise,但他们的文档称它们为“Deferreds”,它是Promises/A规范的实现;还有其他几个 promise 库,包括Q。(YUI 还包含一个 Promise 实现。)

最近(2013 年年中)有很多关于 Promise 的博客文章,因此应该很容易找到有关它们的更多信息,包括模式和特定实现。值得深入研究几个实现的源代码以了解具体细节,但在高层次上,您可以考虑这样的 Promise:

  • 您将异步函数包装在一个 Promise 中并调用它。
  • 然后返回 Promise 本身,这意味着您可以将对它的引用保存在变量中。
  • 当您调用的异步函数完成时,承诺本身将被解决(或“实现”)。
  • 然后,您可以调用done已解决的承诺,将您的回调函数作为参数传递给done.
于 2013-07-12T10:57:41.880 回答
1

这里不就是这样吗:

功能

doSomething = new Object();

doSomething.success = function(callback) {
    // Call the callback
    callback("someData");
}

所以它只是一个扩展了一个成员“成功”的对象,它是一个函数。

于 2013-07-12T10:54:39.387 回答