我有点困惑,我正在使用 callone()
的结果来修改全局对象(我不确定是否有更好的方法来做到这一点),试图通过 deferred 来完成此操作。当我调用two() 时,应该使用新数据修改全局对象
var obj = {};
var id = obj.id;
//global object
$.when(callone(obj)).then(calltwo(id),function(data)
{
});
- Ajax 函数:1
function callone(requiredData)
{
var d = new $.Deferred();
var ajaxCall1 = $.ajax({
type:"POST",
url: 'AB/',
data: requiredData,
success: function(data) {
//return data to the callee?
d.resolve(p_obj);
//set ID on the object
obj.id = data.id;
return obj;
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus + ': ' + errorThrown);
},
always: function(data) { }
});
}
function calltwo(id from callback one)
{
}
最佳答案
我在下面提供了一个更简单的实现。
callone()
必须返回一个延迟或 promise ,以便您等待它或将其他操作链接到它,并且您可以只使用 $.ajax()
已经返回而不是创建自己的。
此外,没有理由在这里使用 $.when()
因为它实际上只会在您尝试等待并行运行的多个 Promise 时增加值(value),而这不是您的情况全部。因此,您可以对已有的各个 Promise 使用 .then()
处理程序。
此外,您确实不想在处理异步操作时使用全局变量。您可以链接 promise 并通过 promise 传递数据。
这是 callone()
的样子:
function callone(requiredData) {
return $.ajax({
type: "POST",
url: 'AB/',
data: requiredData
});
}
function calltwo(...) {
// similar to callone
// returns promise from $.ajax()
}
callone(...).then(function(data) {
// when callone is done, use the id from its result
// and pass that to calltwo
return calltwo(data.id);
}).then(function(data) {
// process result from calltwo here
}, function(err) {
// ajax error here
});
请注意,此代码不会创建任何新的延迟对象。它只是使用已经从 $.ajax()
返回的 Promise。另请注意,它也不使用 success:
或 error:
处理程序,因为这些处理程序也来自 Promise。
另请注意,从 .then()
处理程序中返回的 Promise 会自动将其链接到前一个 Promise 中,因此在新返回的 Promise 也得到解决之前,前一个 Promise 不会得到解决。这可以让您保持链条运转。
另请注意,从异步回调函数返回数据不会将数据返回给原始函数的调用者,因此您尝试从 success:
处理程序返回某些内容并没有完成任何任务。相反,使用 Promise 并通过 Promise 返回数据,因为它们是专门设计用于将异步数据返回到 .then()
处理程序的。
关于javascript - ajax延迟链调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30771635/