JavaScript回调风格-转向promise

JavaScript callback style - Moving to promises

本文关键字:promise -转 风格 回调 JavaScript      更新时间:2023-09-26

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

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

函数调用

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

功能

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

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

函数调用

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

这是如何工作的,有人能为我举一个简单的例子吗?谢谢你抽出时间。

这是promise库的一个实现。jQuery有一个称为deferres的实现,另一个是Q.

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

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

然后调用它,使用

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

这种模式的好处在于,您可以有多个回调和错误回调。

您所描述的样式通常称为promise。jQuery有promise,但他们的文档称之为"Deferred",它是Promise/A规范的实现;还有其他几个promise库,包括Q。(YUI也包含promise实现。)

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

  • 将异步函数封装在promise中,它就会被调用
  • 然后返回promise本身,这意味着您可以在变量中保存对它的引用
  • 当您调用的异步函数完成时,promise本身将被解析(或"实现")
  • 然后,您可以对已解析的promise调用done,将回调函数作为参数传递给done

这里不是很简单吗:

功能

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

因此,它只是一个扩展了成员"success"的对象,这是一个函数。