deferred.promise()| jqueryAPI 2.2 中文手册- AspRain.cn 致力于Web开发技术翻译整理

jQuery API 2.2.0

deferred.promise()

分类:Deferred对象

返回: Promise

deferred.promise( [target ] )

描述:返回某个Deferred对象的Promise对象。

加入于: 1.5
deferred.promise( [target ] )
  • target
    类型:Object
    要附加promise方法的对象

deferred.promise()方法允许传入一个同步函数,以防止别的代码干预它的内部请进程或状态。Promise对象只会泄露了Deferred对象用来附加额外的处理函数或确定状态的方法(.then().done().always().pipe().progress().state().promise()),但是不会泄露用来改变Deferred对象的状态的方法(.resolve().reject().notify().resolveWith().rejectWith().notifyWith())。

如果提供了target,则deferred.promise()将把该方法附加到target上,并返回该对象,而不是创建一个新对象。这个方法可以用来把Promise行为附加到一个已经存在的对象上。

如果你正在创建一个Deferred对象,为这个Deferred对象保存了个引用,从而它可以在某一时点上被解决或被拒绝。利用deferred.promise()方法可以返回Promise对象,从而别的代码可以注册一个回调函数或者检查当前状态。

欲得更多信息,参见Deferred对象

示例

创建一个Deferred对象,并分别向解决该Deferred对外和拒绝该Deferred对象设置两个基于定时器的函数,定时在一个随机时长后面。无论哪个引发了第一个“wins”,都会调用回调函数之一。第二个超时没有效果,因为Deferred已经在第一个超时操作中完成了(要么是被解决状态要么是被拒绝状态)。同样,设置一个基于定时器的进程通知函数,并调用一个进程处理函数,向document.body添加“working...”。

function asyncEvent() {
  var dfd = jQuery.Deferred();
 
  // 在一个随机时长之后解决Deferred对象
  setTimeout(function() {
    dfd.resolve( "hurray" );
  }, Math.floor( 400 + Math.random() * 2000 ) );
 
  // 在一个随机时长之后拒绝Deferred对象
  setTimeout(function() {
    dfd.reject( "sorry" );
  }, Math.floor( 400 + Math.random() * 2000 ) );
 
  // Show a "working..." message every half-second
  setTimeout(function working() {
    if ( dfd.state() === "pending" ) {
      dfd.notify( "working... " );
      setTimeout( working, 500 );
    }
  }, 1 );
 
  // 返回Promise对象,从而调用器不能改变Deferred对象了
  return dfd.promise();
}
 
// 针对asyncEvent附加done、fail、progress处理函数
$.when( asyncEvent() ).then(
  function( status ) {
    alert( status + ", things are going well" );
  },
  function( status ) {
    alert( status + ", you fail this time" );
  },
  function( status ) {
    $( "body" ).append( status );
  }
);

使用目标参数以将一个已有的对象转变成Promise对象:

// Existing object
var obj = {
    hello: function( name ) {
      alert( "Hello " + name );
    }
  },
  // 创建一个Deferred对象
  defer = $.Deferred();
 
// 把一个对象设置为promise对象
defer.promise( obj );
 
// 解决该Deferred对象
defer.resolve( "John" );
 
// 把该对象用作一个promise对象
obj.done(function( name ) {
  obj.hello( name ); // Will alert "Hello John"
}).hello( "Karl" ); // Will alert "Hello Karl"

如果网页上不能运行示例,请点击http://www.asprain.cn/jQueryAPI/deferred.promise.htm查看示例。

如果你觉得本文档对你有用,欢迎给翻译作者支付宝打赏,支持翻译作者源源不断翻译更多有用的技术文档。