声明jQuery AJAX 稍后调用执行
Declare jQuery AJAX call for execution later
我可以这样声明一个 jQuery AJAX 调用:
var foo = $.ajax({ ... });
但这实际上会立即执行请求,对吗?
如何在不首先执行的情况下声明 AJAX 调用,然后再调用它?类似于:
var foo = $.ajax({ ... });
// some stuff in between
foo.execute();
谢谢。
编辑
更多信息:我真正想做的是拥有一个函数,该函数根据参数构造一个 AJAX 请求,returns 将其传递给调用代码,并让调用代码管理其状态(即能够执行它、中止它等)。因此,我不想简单地声明 AJAX 调用的设置,而是希望手头有实际的 XHR 对象,$.ajax returns,只能执行它,中止它,等等
您可以设置您的请求,稍后再执行
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 returns 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 = function foo(settings) {
// if settings passed , extend `$.ajaxSettings`
this.settings = $.extend({}, $.ajaxSettings, settings);
this.ajax = $.ajax;
this.promise = void 0;
this.execute = function execute() {
// set `this.promise` to `this.ajax`
this.promise = this.ajax.call($, this.settings);
// return `$.ajax` jQuery promise object
return this.promise
};
// if `this.promise` is defined , call `.abort()`
// on `this.promise`: `this.ajax` `$.ajax()`
this.abort = this.promise ? this.promise.abort() : this.promise;
};
var url = "https://gist.githubusercontent.com/"
+ "guest271314/6a76aa9d2921350c9d53/raw/"
+ "49fbc054731540fa68b565e398d3574fde7366e9/"
+ "abc.txt";
var request1 = new foo({"url":url});
request1.execute()
.then(function(data, textStatus, jqxhr) {
console.log(data, textStatus, jqxhr)
}, function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
});
var request2 = new foo({"url":url});
request2.execute().abort()
.then(function(data, textStatus, jqxhr) {
console.log(data, textStatus, jqxhr)
}, function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
我可以这样声明一个 jQuery AJAX 调用:
var foo = $.ajax({ ... });
但这实际上会立即执行请求,对吗?
如何在不首先执行的情况下声明 AJAX 调用,然后再调用它?类似于:
var foo = $.ajax({ ... });
// some stuff in between
foo.execute();
谢谢。
编辑 更多信息:我真正想做的是拥有一个函数,该函数根据参数构造一个 AJAX 请求,returns 将其传递给调用代码,并让调用代码管理其状态(即能够执行它、中止它等)。因此,我不想简单地声明 AJAX 调用的设置,而是希望手头有实际的 XHR 对象,$.ajax returns,只能执行它,中止它,等等
您可以设置您的请求,稍后再执行
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 returns 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 = function foo(settings) {
// if settings passed , extend `$.ajaxSettings`
this.settings = $.extend({}, $.ajaxSettings, settings);
this.ajax = $.ajax;
this.promise = void 0;
this.execute = function execute() {
// set `this.promise` to `this.ajax`
this.promise = this.ajax.call($, this.settings);
// return `$.ajax` jQuery promise object
return this.promise
};
// if `this.promise` is defined , call `.abort()`
// on `this.promise`: `this.ajax` `$.ajax()`
this.abort = this.promise ? this.promise.abort() : this.promise;
};
var url = "https://gist.githubusercontent.com/"
+ "guest271314/6a76aa9d2921350c9d53/raw/"
+ "49fbc054731540fa68b565e398d3574fde7366e9/"
+ "abc.txt";
var request1 = new foo({"url":url});
request1.execute()
.then(function(data, textStatus, jqxhr) {
console.log(data, textStatus, jqxhr)
}, function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
});
var request2 = new foo({"url":url});
request2.execute().abort()
.then(function(data, textStatus, jqxhr) {
console.log(data, textStatus, jqxhr)
}, function(jqxhr, textStatus, errorThrown) {
console.log(textStatus, errorThrown)
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>