2016-04-28 2 views
-1

Я хочу выполнить несколько запросов ajax и подождать, пока все не будут выполнены, а затем продолжить использование метода jQuery $.when().

Для PHP скриптов это работает отлично, я создал несколько функций, например:

function ajax1() { 
    var settings = { 
     type: "GET", 
     url: "root/scripts/script.php", 
    }; 
    return $.ajax(settings); 
} 

Но как это будет работать, если я дополнительно хочу ждать функций JS, которая находится в другом месте Thann $.when(..) инструкция?

Например, function abc(), расположенный в root/scripts/a.js. Как я могу выполнить вызов AJAX для функции, расположенной в локальном JS-файле, и добавить это в конструкцию $.when()? Такой, что:

$.when(ajax1(), ajax2()).done(function(a1, a2){ 
     //a1[0] is the return value from the php script 
     //a2[0] is the return value from the function abc() 
}); 
+0

Я не уверен, что вы просите. Расположение функции не имеет значения, пока оно находится в области видимости. –

+0

Но как бы выглядел синтаксис ajax-вызова функции js? Простое изменение URL-адреса приведенного выше примера php недостаточно. Как я могу указать для выполнения функции 'abc()'? – d4rty

ответ

1

Так как JS выполняется последовательно, оно должно быть достаточно, чтобы включить функцию abc() в качестве первой линии $.when тела.

Это выполняет а() только после того, как все Аякса вызовов выполняются:

$.when(ajax1(), ajax2(), ajax3(), ajax4()).done(function(a1, a2, a3, a4){ 
    $.getScript("file_where_abc_is.js", function(data, textStatus, jqxhr) { 
     abc(); 
     //... 
    }); 
}); 

линии ниже abc() не будет выполняться, пока весь Аякс вызовы не выполняются, и функция abc() завершена.

Предыдущий подход позволит избежать вызова abc(), если один из ajax возвращает определенное значение/ошибку. Также вы можете убедиться, что все вызовы ajax выполняются до вызова abc(). Или вызывать разные функции в зависимости от результата вызовов ajax. Я не уверен, что вам нужно какое-либо из них.

Если вы не возражаете, или все равно, когда а() вызываются вы также можете сделать это наоборот:

$.getScript("file_where_abc_is.js", function(data, textStatus, jqxhr) { 
    $.when(ajax1(), ajax2(), ajax3(), ajax4(), abc()).done(function(a1, a2, a3, a4, abcAnswer) { 
     //... 
    } 
}); 

Еще один вариант, похожий на последний:

function ajaxABC() { 
    $.getScript("file_where_abc_is.js", function() { 
     return abc(); 
    }); 
} 

$.when(ajax1(), ajax2(), ajax3(), ajax4(), ajaxABC()).done(function(a1, a2, a3, a4, abcAnswer) { 
    // .... 
} 

PS: Не выполнил код, могут быть мелкие детали для точной настройки.

+0

Но функция 'abc()' не находится в файле, где находится инструкция '$ .when (..)'. Поэтому я не могу просто вызвать 'abc()'. – d4rty

+0

Разве вы не можете его загрузить? 'jQuery.getScript ('file_where_abc_is.js')' –

+0

Итак, вы имеете в виду что-то вроде этого: '$ .when (ajax1(), ajax2(), ajax3(), ajax4()). done (function (a1, a2, a3, a4) {jQuery.getScript ('file_where_abc_is.js') ... '? – d4rty

1

Надежда это то, что вы ищете:

var func1Cb = function(){ 
 
    for(var i = 0; i < 10000; i++); 
 
    console.log('done1'); 
 
    var promise = $.Deferred(); 
 
    promise.resolve(); 
 
    return promise; 
 
} 
 

 
var func2Cb = function(){ 
 
    for(var i = 0; i < 10000; i++); 
 
    console.log('done2'); 
 
    var promise = $.Deferred(); 
 
    promise.resolve(); 
 
    return promise; 
 
} 
 

 
$.when(func1Cb(), func2Cb()).done(function(){ 
 
    console.log(123); 
 
});

+0

Как это работает, если 'func1Cb()' находится в 'script1.js',' func2Cb() 'находится в' script2.js', а '$ .when (..)' construct находится в 'script3 .js'? – d4rty

+0

Не имеет значения, в каком js-файле они расположены до тех пор, пока код сценария будет выполняться после завершения сценария1 и сценария2. – Pavel

+0

Но предположим, что у меня есть 'script1.js' с функцией' func1Cb() 'и' script2 .js' с функцией 'func1Cb()'. Я не могу просто сказать, например, в 'script3.js'' $ .when (func1Cb(), ... '. Мне нужно указать путь к файлу скрипта. Как это сделать? – d4rty

Смежные вопросы