在一个成功的人中进行ajax调用可以被认为是不好的做法?

时间:2013-09-04 20:30:01

标签: javascript ajax jquery

让我们采取以下代码:

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

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

3 个答案:

答案 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来进行串行执行。)

有一点需要注意的是, faildone只是then 的限制形式的缩写。这些方法可以(并且应该)用于明确意图/代码。

答案 1 :(得分:3)

如果需要回调按顺序运行,则需要这样做。如果他们需要并行完成(订单无法保证),那么你就不应该这样做。这不是好的或坏的做法问题。这是你需要完成的事情。

答案 2 :(得分:1)

这样做没有明显的错误,但您可以考虑使用jQuery Deferred Objects.