gpt4 book ai didi

javascript - 在另一个 AJAX 调用之前重用 JavaScript AJAX 调用

转载 作者:行者123 更新时间:2023-11-30 16:42:14 26 4
gpt4 key购买 nike

我有两个按钮都执行 AJAX 调用:

$("#save").click(function() {
$.ajax({
type: "POST",
url: saveEntryURL,
data: { id: $("#id").val() },
success: function(r) {
...
},
error: function(r) {
...
}
})
})

$("#tag-as-final").click(function() {
$.ajax({
type: "POST",
url: finalizeEntryURL,
data: { id: $("#id").val() },
success: function(r) {
...
},
error: function(r) {
...
}
})
})

要求是当用户点击finalize按钮时,系统会先进行一次save,然后才真正标记为final。为了重用附加到保存按钮的代码,我在实际的 AJAX 调用之前调用了保存按钮的 onclick 监听器,如下所示:

$("#tag-as-final").click(function() {
$("#save").click()
^^^^^^^^^^^^^^^^^^
$.ajax({
type: "POST",
url: finalizeEntryURL,

但它不会执行“保存后完成”行为,因为两个 AJAX 调用都是异步的。我需要一个接一个地运行,但无法使保存按钮的 AJAX 调用同步(在标记发生时我也在做很多其他事情)。我知道这很愚蠢,但我在想类似于...

$("#tag-as-final").click(function() {
$("#save").click().peformAsyc()
^^^^^^^^^^^^
$.ajax({
type: "POST",
url: finalizeEntryURL,

...这将强制它在继续之前先完成链接功能的执行,但我知道这是不可用的。有什么办法吗?我当前的解决方法是将相同的保存 AJAX 函数放置在最终化 AJAX 函数中,尽管它不允许我编写 DRY(不要重复自己)代码:

$("#tag-as-final").click(function() {
$.ajax({
type: "POST",
url: saveEntryURL,
data: { id: $("#id").val() },
success: function(r) {
...
$.ajax({
type: "POST",
url: finalizeEntryURL,
data: { id: $("#id").val() },
success: function(r) {
...
},
error: function(r) {
...
}
})
},
error: function(r) {
...
}
})
})

最佳答案

这很简单,你最好使用 jquery“promises”。像这样:

var generalSettings = { }; //Settings for AJAX call.
var jqXHR = $.ajax(generalSettings); //Do AJAX call.
generalSettings.data = 'newdata'; //update generalSettings
jqXHR.done(function(data){
$.ajax(generalSettings); //New Petition with updated settings.
});

这是使用 ES6 promise 和 jQuery promise :

function doAjaxAsPromise(settings){
return new Promise(function(resolve){
var jqXHR = $.ajax(settings);
jqXHR.done(function(data){
resolve(data);
});
});
}

var settings = { };
var petition = doAjaxAsPromise(settings);
var secondpetition = petition.then(function(data){
//work with data
//new settings
var settings = { };
return doAjaxAsPromise(settings);
});
var thirdpetition = secondpetition.then(function(data){
//work with data
//new settings
var settings = { };
return doAjaxAsPromise(settings);
});
//If needed to reuse settings object outside promise scope:
//var settings = Object.create(settings);

您可以为代码重用做一些其他好的事情:

function save(settings) {
var prom = doAjaxAsPromise(settings);
return prom.then(function(data){
//do something with your data.
});
}

function tagAsFinal(savedPromise, settings){
return savedPromised.then(function(){
var prom = doAjaxAsPromise(settings);
return prom.then(function(data){
//work with data;
});
});
}

$('save').on('click', function(){
save(settings); //settings = $.ajax settings.
});

$('tagAsFinal').on('click', function(){
var generalSettings = { };
var settingsone = Object.create(generalSettings);
var settingstwo = Object.create(generalSettings);
var saved = save(settingsone); //$.ajax settings.
tagAsFinal(saved, settingstwo);
});
//Can still be reduced.

关于javascript - 在另一个 AJAX 调用之前重用 JavaScript AJAX 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31778196/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com