JavaScript回调样式 - 转向承诺

时间:2013-07-12 10:48:10

标签: javascript

我正试图弄清楚如何以不同的方式进行JavaScript回调。

我当前的回调样式,将回调传递给函数,函数调用回调。例如:

函数调用

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

功能

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

这是我正在使用的当前回调样式。但我看到过以不同风格进行回调的图书馆。例如:

函数调用

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

这是如何运作的,任何人都能为我勾勒出一个简单的例子吗?谢谢你的时间。

3 个答案:

答案 0 :(得分:4)

这是promise库的一个实现。 jQuery有一个名为deferreds的实现,另一个是Q

使用jQuery

doSomething看起来像这样。

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

然后调用它,使用

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

这种模式有什么好处,就是你可以有多个回调和错误回调。

答案 1 :(得分:3)

您所描述的风格通常称为承诺。 jQuery有承诺,但他们的文档称之为"Deferreds",它是Promises/A规范的实现;还有其他几个承诺库,包括Q。 (YUI还包含一个promises实现。)

最近有一些关于promises的(2013年中)博客文章,所以很容易找到关于它们的更多信息,无论是作为模式还是关于具体实现。值得深入研究几个实现的源代码,看看这个问题,但从高层次来看,你可以想到这样的承诺:

  • 在promise中包装异步函数并调用它。
  • 然后返回promise本身,这意味着您可以在变量中保存对它的引用。
  • 当你调用的异步函数完成时,promise本身将被解析(或“完成”)。
  • 然后,您可以在已解决的承诺上调用done,将您的回调函数作为参数传递给done

答案 2 :(得分:1)

这不就是这里:

<强>功能

doSomething = new Object();

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

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