如何延迟 ajax 调用几秒
How delay ajax call by few seconds
我不确定这是为 facebook api 发送 2 ajax 的最佳方式。
但它有效,问题是有时我在第一个 (result.php) 之前得到第二个 ajax (result_flow.php)
将有助于延迟秒 ajax (url:result_flow.php) 3 秒或以某种方式更改此代码以发出命令。
我尝试了 setTimeout 但没有成功。
$('#sub').click(function () {
var data = $("input#dataInput").val();
console.log(data);
var total = $("input#totalInput").val();
var subscriber_id = $("input#subscriber_id").val();
var res_name = $("input#res_name").val();
var dataString = 'data='+ data + '&total=' + total + '&subscriber_id=' + subscriber_id+ '&res_name=' + res_name;
console.log(dataString);
$.ajax({
type: "POST",
url: "result.php",
data: dataString,
success: function(data) {
console.log(data);
if(data==='success'){
//localStorage.clear();
MessengerExtensions.requestCloseBrowser(function success() {
console.log("Webview closing");
}, function error(err) {
console.log(err);
});
}
}
});
$.ajax({
type: "POST",
url: "result_flow.php",
data: dataString,
success: function(data) {
setTimeout(function(){
console.log(data);
if(data==='success'){
}
},3000);
}
});
}
首先,setTimeout()
不起作用,因为您将它放在回调中,这意味着它将在请求完成后执行。无论如何,这不是处理此类任务的正确方法,您应该将第二个请求放在第一个请求的回调中,以便它会在第一个请求完成时执行。
代码如下所示:
$('#sub').click(function() {
var data = $("input#dataInput").val();
console.log(data);
var total = $("input#totalInput").val();
var subscriber_id = $("input#subscriber_id").val();
var res_name = $("input#res_name").val();
var dataString = 'data=' + data + '&total=' + total + '&subscriber_id=' + subscriber_id + '&res_name=' + res_name;
console.log(dataString);
$.ajax({
type: "POST",
url: "result.php",
data: dataString,
success: function(data) {
console.log(data);
if (data === 'success') {
//localStorage.clear();
MessengerExtensions.requestCloseBrowser(function success() {
console.log("Webview closing");
}, function error(err) {
console.log(err);
});
$.ajax({
type: "POST",
url: "result_flow.php",
data: dataString,
success: function(data) {
console.log(data);
}
});
}
}
});
}
请注意,在我的代码中,只有在第一个请求成功时才会发送第二个请求,因为它位于 if (data === 'success') {...}
语句中。
你应该在链中调用它们。 成功...然后...使用 promise 是最好的方法。
如果订单不是您明确写的,请不要相信您收到的订单。
Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(),
and jqXHR.always() instead.
你可以这样做:
// First Ajax call
$.ajax({
// Do the request
// Remove success to use new promise
})
.done(function( data ) {
// Add the success here
// Add the Second Ajax call here or create a function to call it, whatever you want
});
我现在建议使用 async/await,使用 AJAX 顺序调用非常容易:
$('#sub').click(async () => {
...
try {
let data = await $.post({
url: "result.php",
data: dataString
});
if (data === 'success') {
...
}
data = await $.post({
url: "result_flow.php",
data: dataString
});
if (data === 'success') {
...
}
} catch (err) {
console.log(err);
}
});
未测试,因为我不使用 jQuery - 但它应该会给你想法。由于 $.ajax/$.post
支持 Promises,它应该与 async/await 一起工作。请注意,您可能需要使用 Babel 为旧版浏览器转译代码,但我还是建议使用 Babel。
如果要同时使用两个 AJAX 调用,请使用 Promise.all(因为它们不相互依赖)- 结果将按顺序排列,因此您可以确保按顺序调用回调代码。
我不确定这是为 facebook api 发送 2 ajax 的最佳方式。 但它有效,问题是有时我在第一个 (result.php) 之前得到第二个 ajax (result_flow.php) 将有助于延迟秒 ajax (url:result_flow.php) 3 秒或以某种方式更改此代码以发出命令。
我尝试了 setTimeout 但没有成功。
$('#sub').click(function () {
var data = $("input#dataInput").val();
console.log(data);
var total = $("input#totalInput").val();
var subscriber_id = $("input#subscriber_id").val();
var res_name = $("input#res_name").val();
var dataString = 'data='+ data + '&total=' + total + '&subscriber_id=' + subscriber_id+ '&res_name=' + res_name;
console.log(dataString);
$.ajax({
type: "POST",
url: "result.php",
data: dataString,
success: function(data) {
console.log(data);
if(data==='success'){
//localStorage.clear();
MessengerExtensions.requestCloseBrowser(function success() {
console.log("Webview closing");
}, function error(err) {
console.log(err);
});
}
}
});
$.ajax({
type: "POST",
url: "result_flow.php",
data: dataString,
success: function(data) {
setTimeout(function(){
console.log(data);
if(data==='success'){
}
},3000);
}
});
}
首先,setTimeout()
不起作用,因为您将它放在回调中,这意味着它将在请求完成后执行。无论如何,这不是处理此类任务的正确方法,您应该将第二个请求放在第一个请求的回调中,以便它会在第一个请求完成时执行。
代码如下所示:
$('#sub').click(function() {
var data = $("input#dataInput").val();
console.log(data);
var total = $("input#totalInput").val();
var subscriber_id = $("input#subscriber_id").val();
var res_name = $("input#res_name").val();
var dataString = 'data=' + data + '&total=' + total + '&subscriber_id=' + subscriber_id + '&res_name=' + res_name;
console.log(dataString);
$.ajax({
type: "POST",
url: "result.php",
data: dataString,
success: function(data) {
console.log(data);
if (data === 'success') {
//localStorage.clear();
MessengerExtensions.requestCloseBrowser(function success() {
console.log("Webview closing");
}, function error(err) {
console.log(err);
});
$.ajax({
type: "POST",
url: "result_flow.php",
data: dataString,
success: function(data) {
console.log(data);
}
});
}
}
});
}
请注意,在我的代码中,只有在第一个请求成功时才会发送第二个请求,因为它位于 if (data === 'success') {...}
语句中。
你应该在链中调用它们。 成功...然后...使用 promise 是最好的方法。
如果订单不是您明确写的,请不要相信您收到的订单。
Deprecation Notice: The jqXHR.success(), jqXHR.error(), and jqXHR.complete()
callbacks are removed as of jQuery 3.0. You can use jqXHR.done(), jqXHR.fail(),
and jqXHR.always() instead.
你可以这样做:
// First Ajax call
$.ajax({
// Do the request
// Remove success to use new promise
})
.done(function( data ) {
// Add the success here
// Add the Second Ajax call here or create a function to call it, whatever you want
});
我现在建议使用 async/await,使用 AJAX 顺序调用非常容易:
$('#sub').click(async () => {
...
try {
let data = await $.post({
url: "result.php",
data: dataString
});
if (data === 'success') {
...
}
data = await $.post({
url: "result_flow.php",
data: dataString
});
if (data === 'success') {
...
}
} catch (err) {
console.log(err);
}
});
未测试,因为我不使用 jQuery - 但它应该会给你想法。由于 $.ajax/$.post
支持 Promises,它应该与 async/await 一起工作。请注意,您可能需要使用 Babel 为旧版浏览器转译代码,但我还是建议使用 Babel。
如果要同时使用两个 AJAX 调用,请使用 Promise.all(因为它们不相互依赖)- 结果将按顺序排列,因此您可以确保按顺序调用回调代码。