Javascript 在成功的ajax调用中进行ajax调用被认为是不好的做法?

Javascript 在成功的ajax调用中进行ajax调用被认为是不好的做法?,javascript,ajax,jquery,Javascript,Ajax,Jquery,让我们看一下下面的代码: $.ajax({ type: 'POST', dataType: dataType, url: 'someUrl', success: function(result){ $.ajax({ type: 'POST', dataType: dataType, url: 'anotherUrl', data: queryToSear

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

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

这会被认为是一种不好的做法吗?它对性能有影响吗?如果是,是否有更好的方法来执行类似操作?

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

使用承诺。希望如此,那么:

$.ajax({..})//承诺1
.fail(函数(){
//哎呀!如果(且仅当)承诺1失败,这将触发。
})
.然后(函数(){
//这将仅在第一个请求没有错误时触发-已“完成”
//然后,我们对第二个请求返回一个新的承诺。以适当的方式
//承诺/A,“then”返回一个(新的)承诺。(jQuery<1.8被破坏。)
返回$.ajax({..})//承诺2
})
//请注意,这些是针对已从中返回的第二个承诺
//“then”在默认情况下自动创建的第二个承诺之上或来自第二个承诺
//故障处理程序。
.fail(函数(){
//哎呀!如果其中一个承诺(AJAX调用)失败,这将触发。
//发生这种情况是因为我们要么遵守承诺2
//或从默认failHandler返回的自动拒绝承诺。
})
.done(函数(){
//第二个承诺完成-意味着两个都完成了!
})
在时使用
是不合适的,因为这将是“并行的”。(实际上,
when
可以与连接到第二次调用完成时接受的“存根”承诺一起使用-但是这不会受益于
然后
链接,并且不可能有意义地将第二次调用的承诺直接用于串行执行。)


需要注意的一件有趣的事情是,
fail
done
只是
then
的缩写/限制形式。这些方法可以(也应该)用于明确目的/代码。

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

这两个调用是需要顺序进行,还是可以同时进行?我在第二个AJAX调用中没有看到任何东西,这取决于第一个调用。我已经使用这个调用一段时间了,从来没有出现过任何问题。。。我认为除了
asyn:false
之外,没有其他方法可以用来保存ajax调用,@David,很抱歉我不清楚,我已经编辑了代码:使用嵌套方法,这里只有两个负面影响,您可能正在创建不必要的闭包,并向回调spagetti添加更多。我建议你为此做出承诺。你的代码至少会更可读。这是一种方法。看起来很有趣。。。处理承诺而不是将ajax调用链接到success中有什么好处?@AlexandreWiechersVaz嵌套更少,代码“流”更干净。这只是另一个概念/习惯用法-不是必需的,但很有用。理解。。。所以这更像是一个可读性问题。。。还有一个问题。如果第二个失败了怎么办?失败链是否指向第一个?链接一些关于延迟的讨论:@AlexandreWiechersVaz它取决于调用的“处理程序”,它是位置的<代码>失败(f)
->
然后(null,f)
失败(f)。完成(d)
->
然后(d,f)
$.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!
 })