5

让我们看下面的一段代码:

$.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
    });

这可以被认为是一种不好的做法吗?对性能有影响吗?如果是,有没有更好的方法来做这样的事情?

4

3 回答 3

9

使用承诺。希望Promises/A在 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 可以与“存根”promise 一起使用,该promise 在第二次调用完成时被有线接受——但是这并不能从then链接中受益,并且不可能有意义地将第二次调用中的promise 直接用于串行执行。 )

需要注意的一件有趣的事情是failanddone只是then. 这些方法可以(并且应该)用于清晰的意图/代码。

于 2013-09-04T20:39:46.810 回答
3

如果您需要回调按顺序运行,您需要这样做。如果它们需要并行完成(不能保证顺序),那么您不应该这样做。这不是好的或坏的实践问题。这是你需要完成什么的问题。

于 2013-09-04T20:33:51.550 回答
1

这样做并没有明显的错误,但您可能会考虑使用jQuery Deferred Objects。

于 2013-09-04T20:40:05.697 回答