Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明jQuery AJAX调用以便稍后执行_Jquery_Ajax_Jquery Deferred - Fatal编程技术网

声明jQuery AJAX调用以便稍后执行

声明jQuery AJAX调用以便稍后执行,jquery,ajax,jquery-deferred,Jquery,Ajax,Jquery Deferred,我可以这样声明jQuery AJAX调用: var foo=$.ajax({…}) 但这实际上会立即执行请求,对吗 如何声明AJAX调用而不先执行它,然后再调用它?比如: var foo = $.ajax({ ... }); // some stuff in between foo.execute(); 谢谢 编辑 更多信息:我真正想做的是有一个函数,它基于参数构造AJAX请求,将其返回给调用代码,并让调用代码管理其状态(即,能够执行它,中止它,等等)。因此,与简单地声明AJAX调用的设置不同

我可以这样声明jQuery AJAX调用:

var foo=$.ajax({…})

但这实际上会立即执行请求,对吗

如何声明AJAX调用而不先执行它,然后再调用它?比如:

var foo = $.ajax({ ... });
// some stuff in between
foo.execute();
谢谢

编辑
更多信息:我真正想做的是有一个函数,它基于参数构造AJAX请求,将其返回给调用代码,并让调用代码管理其状态(即,能够执行它,中止它,等等)。因此,与简单地声明AJAX调用的设置不同,我希望手头有$.AJAX返回的实际XHR对象,它只具有执行、中止等功能。

您可以设置请求,然后稍后执行它

 var ajaxSettings={};
 //....do other things
  $.ajax(ajaxSettings);//then call ajax 
或者可以通过如下设置ajax同步运行它

   jQuery.ajaxSetup({async:false});

如果我没弄错的话,你想要

var foo = $.ajax({ ... });
// some stuff in between
result = foo.execute(); 
// do something based on result
然而,这是行不通的,因为根据定义,ajax调用是同步处理的。 您可以使用一个函数获取回调并将其传递给ajax成功处理程序

function myAjaxThingy(callback) {
    $.ajax({...},
    success: function(a){callback.call(a)} )
}

// some stuff

myAjaxThingy(function(a) {// do whatever based on a, or not...})
不过,我不确定我是否真的明白你需要什么

编辑:好的,我想我现在明白了!您需要做的就是定义一个稍后调用的函数

function myAjaxThingy() {$.ajax({...})}
// something, something, dark side...
myAjaxThingy() // will execute it

$.ajax返回promise对象,因此我们可以创建函数:

function prepareAjax(properties) {
  var defer = $.Deferred();

  var promise = defer.promise();

  return $.extend(promise, {
    execute: function () {
      return $.ajax(properties).then(defer.resolve.bind(defer), defer.reject.bind(defer));
    }
  });
}
调用此函数,例如:

var xhr = prepareAjax({ method: 'get', url: 'https://localhost:8001' })
将结果写入控制台:

xhr.then(function (result) { console.log(result) });
并执行:

xhr.execute()
试一试

var foo=函数foo(设置){
//如果设置通过,则扩展“$.ajaxSettings”`
this.settings=$.extend({},$.ajaxSettings,settings);
this.ajax=$.ajax;
此.promise=void 0;
this.execute=函数execute(){
//将“this.promise”设置为“this.ajax”`
this.promise=this.ajax.call($,this.settings);
//返回`$.ajax`jQuery承诺对象
把这个还给我,答应我
};
//如果定义了'this.promise',则调用'.abort()`
//关于'this.promise':'this.ajax`$.ajax()`
this.abort=this.promise?this.promise.abort():this.promise;
};
变量url=”https://gist.githubusercontent.com/"
+“宾客271314/6a76aa9d2921350c9d53/raw/”
+“49fbc054731540fa68b565e398d3574fde7366e9/”
+“abc.txt”;
var request1=newfoo({“url”:url});
request1.execute()
.then(函数(数据、文本状态、jqxhr){
日志(数据、文本状态、jqxhr)
},函数(jqxhr,textStatus,errorshown){
console.log(textStatus,errorshown)
});
var request2=newfoo({“url”:url});
request2.execute().abort()
.then(函数(数据、文本状态、jqxhr){
日志(数据、文本状态、jqxhr)
},函数(jqxhr,textStatus,errorshown){
console.log(textStatus,errorshown)
});


但是手头有实际的XHR对象呢?我真正想做的是让一个函数基于参数构造一个AJAX请求,将其返回给调用代码,并让调用代码管理其状态(即,能够执行它、中止它等等)。请看@Mikalai responseThanks Ninigi,但我希望从该函数返回XHR对象,能够执行和中止(XHR对象上的其他函数)。上面米卡莱的回答与我所追求的是一致的。谢谢你的回复!我明白了,你应该接受他的回答,这真是切中要害,我得承认我从来没有想过承诺:)你是如何处理成功的?