让我们采取以下代码:
$.ajax({
type: 'POST',
dataType: dataType,
url: 'someUrl',
success: function(result){
$.ajax({
type: 'POST',
dataType: dataType,
url: 'anotherUrl',
data: queryToSearch,
success: function(anotherResult){
(do something that uses the first one result)
},
error: MyObj.defaultAjaxError
});
},
error: MyObj.defaultAjaxError
});
这可以被认为是一种不好的做法吗?它对性能有任何影响吗?如果是,是否有更好的方法来做这样的事情?
答案 0 :(得分:10)
使用Promises。希望Promises/A(作为implemented in jQuery 1.8+ Deferred Objects),然后:
$.ajax({..}) // Promise 1
.fail(function () {
// Oops! This will fire if (and only if) Promise 1 failed.
})
.then(function () {
// This will only fire if the first request had no error - was "done"
// We then return a NEW promise for the 2nd request. In a proper
// Promises/A, 'then' returns a (new) promise. (jQuery < 1.8 is broken.)
return $.ajax({..}) // Promise 2
})
// Note that these are for the 2nd promise which has been returned from
// the 'then' above OR from a 2nd promise created automatically by the default
// failHandler.
.fail(function () {
// Oops! This will fire if EITHER the promises (AJAX calls) fails.
// This happens because we are either binding to our Promise 2
// or to the auto-rejected promise returned from the default failHandler.
})
.done(function () {
// 2nd promise done - means both are done!
})
使用when
是不恰当的,因为那将是“并行”。 (实际上,when
可以与“存根”承诺一起使用,该承诺在第二次调用完成时被接受 - 但是这不会受益于then
链接和不可能直接使用第二次调用的promise来进行串行执行。)
有一点需要注意的是, fail
和done
只是then
的限制形式的缩写。这些方法可以(并且应该)用于明确意图/代码。
答案 1 :(得分:3)
如果需要回调按顺序运行,则需要这样做。如果他们需要并行完成(订单无法保证),那么你就不应该这样做。这不是好的或坏的做法问题。这是你需要完成的事情。
答案 2 :(得分:1)
这样做没有明显的错误,但您可以考虑使用jQuery Deferred Objects.