当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


JQuery deferred.then()用法及代码示例


用法
deferred.then( doneFilter [, failFilter ] [, progressFilter ] ) => Promise

说明:添加要在 Deferred 对象被解析、拒绝或仍在进行中时调用的处理程序。

  • 添加的版本:1.8deferred.then( doneFilter [, failFilter ] [, progressFilter ] )

    • doneFilter
      类型:Function ()
      解析 Deferred 时调用的函数。
    • failFilter
      类型:Function ()
      当 Deferred 被拒绝时调用的可选函数。
    • progressFilter
      类型:Function ()
      当进度通知发送到 Deferred 时调用的可选函数。
  • 添加的版本:1.5,删除:1.8deferred.then( doneCallbacks, failCallbacks )

    • doneCallbacks
      类型:Function ()
      解析 Deferred 时调用的函数或函数数组。
    • failCallbacks
      类型:Function ()
      当 Deferred 被拒绝时调用的函数或函数数组。
  • 添加的版本:1.7,删除:1.8deferred.then( doneCallbacks, failCallbacks [, progressCallbacks ] )

    • doneCallbacks
      类型:Function ()
      解析 Deferred 时调用的函数或函数数组。
    • failCallbacks
      类型:Function ()
      当 Deferred 被拒绝时调用的函数或函数数组。
    • progressCallbacks
      类型:Function ()
      当 Deferred 通知进度时调用的函数或函数数组。

在 jQuery 1.8 之前,参数可以是函数或函数数组。

对于所有签名,如果不需要该类型的回调,则参数可以是null。或者,使用 .done().fail().progress() 仅设置一种类型的回调而不过滤状态或值。

从 jQuery 1.8 开始, 这deferred.then()方法返回一个新的 Promise,它可以通过函数过滤延迟的状态和值,替换 now-deprecateddeferred.pipe()方法。这doneFilterfailFilter函数过滤原始延迟的已解决/已拒绝状态和值。这progressFilter函数过滤对原始延迟的任何调用notify或者notifyWith方法。这些过滤器函数可以返回一个新值以传递给 Promise 的.done()或者.fail()回调,或者它们可以返回另一个可观察对象(Deferred、Promise 等),它将其已解决/拒绝状态和值传递给 Promise 的回调。如果使用的过滤器函数是null, 或未指定,promise 将被解析或拒绝,并使用与原始值相同的值。

回调按照添加的顺序执行。由于 deferred.then 返回一个 Promise,因此可以将 Promise 对象的其他方法链接到这个,包括额外的 .then() 方法。

例子:

由于 jQuery.get 方法返回一个从 Deferred 对象派生的 jqXHR 对象,我们可以使用 .then 方法附加处理程序。

$.get( "test.php" ).then(
  function() {
    alert( "$.get succeeded" );
  }, function() {
    alert( "$.get failed!" );
  }
);

过滤解析值:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>deferred.then demo</title>
  <script src="https://code.jquery.com/jquery-3.5.0.js"></script>
</head>
<body>
 
<button>Filter Resolve</button>
<p></p>
 
<script>
var filterResolve = function() {
  var defer = $.Deferred(),
    filtered = defer.then(function( value ) {
      return value * 2;
    });
 
  defer.resolve( 5 );
  filtered.done(function( value ) {
    $( "p" ).html( "Value is ( 2*5 = ) 10: " + value );
  });
};
 
$( "button" ).on( "click", filterResolve );
</script>
 
</body>
</html>

演示:

过滤拒绝值:

var defer = $.Deferred(),
  filtered = defer.then( null, function( value ) {
    return value * 3;
  });
 
defer.reject( 6 );
filtered.fail(function( value ) {
  alert( "Value is ( 3*6 = ) 18: " + value );
});

连锁任务:

var request = $.ajax( url, { dataType: "json" } ),
  chained = request.then(function( data ) {
    return $.ajax( url2, { data: { user: data.userId } } );
  });
 
chained.done(function( data ) {
  // data retrieved from url2 as provided by the first request
});

相关用法


注:本文由纯净天空筛选整理自jquery.com大神的英文原创作品 deferred.then()。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。