2016-01-07 4 views
-1

У меня есть два js-файла, то есть myJs1.js и myJs2.js. Из myJs1.js вызывается метод myJs2.js.Как вернуть несколько значений из события успеха ajax

Я хочу вернуться r1 и r2 в результаты (в myJs1.js)

Я попытался это: я объявил r1 и r2 переменных перед вызовом AJAX и после Ajax вызова я добавил:

return [r1,r2]; 

Но оно возвращает r1 и r2 как undefined. Когда я исследовал проблему, я наткнулся на то, что добавление async: false может работать, но у нее так много проблем (например, замораживание браузера). Тем не менее, я попробовал это и до сих пор не смог получить значения r1 и r2.

Примечание: Я использую AJAX в первый раз, так что имейте это в виду.

EDIT: В Js1 есть вызов ajax, в котором на этапе события вызывается метод. Я хочу, чтобы получить доступ к результату для вызова другого метода в СП1

EDIT: СМОТРИТЕ ЗДЕСЬ ДЛЯ КОДА

myJS1:

function method() 
{ 

$.ajax({ 
    type: "GET", 
    dataType: "json", 
    url: "http://127.0.0.1:8000/***/***", 
    success: function(response){ 
     result=methodOfmyJs2(response); 
     load1(r1); //r1 from result 
     load2(r2); //r2 from result 
    } 
}) 

}

myJs2:

function methodOfmyJs2(data) 
{ 
    $.ajax({ 
    type: "GET", 
    data:SomeData, 
    dataType: "json", 
    url: "http://127.0.0.1:8000/***/***", 
    success: function(response){ 
     r1=anotherMethodFromThisJS1(response); 
     r2=anotherMethodFromThisJS2(response); 
     result=[r1,r2] 
    } 
}) 

}

Мне нужно получить доступ к значениям r1 и r2 для вызова метода load1 и load2 myJs1.

+5

wtf this _is_ jQuery –

+2

Вы не можете возвращать значения из асинхронной операции. Это не имеет никакого смысла. И вы уже используете jQuery. – Pointy

+2

Возможный дубликат [Как вернуть ответ от асинхронного вызова?] (Http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call) – nem035

ответ

2

Вместо этого вы можете использовать обратный вызов.

[EDIT]

myJS1:

function method() { 
    $.ajax({ 
     type: "GET", 
     dataType: "json", 
     url: "http://127.0.0.1:8000/***/***", 
     success: function (response) { 
      methodOfmyJS2(function (r1, r2) { 
       load1(r1); 
       load2(r2); 
      }); 
     } 
    }); 
} 

myJS2:

methodOfmyJs2 (callback) { 
    $.ajax({ 
     type: "GET", 
     data: somedata, 
     dataType: "json", 
     url: "http://127.0.0.1:8000/****/****", 
     success: function (response) { 
      var r1 = anotherMethodFromThisJS1(response); 
      var r2 = anotherMethodFromThisJS2(response); 

      callback(r1, r2); 
    }); 
} 
+0

Благодарим вас за быстрый ответ. Я редактировал код вопроса «вызов метода имеет параметр« данные ». Как насчет этого. –

+0

Не могли бы вы рассмотреть вопрос снова. Я отредактировал его сейчас правильно. Зори для невменяемого. –

+0

Я не могу понять, что вы пытаетесь сказать в редактировании. Вы хотите получить доступ к результату одного вызова ajax в другой вызов ajax? – 11thdimension

2

Ajax звонки asynchronous по умолчанию, то есть функция Ajax вызова jQuery.ajax() обыкновение ждать ответа HTTP, чтобы вернуться перед возвращением.

Чтобы получить данные после прибытия ответа HTTP, мы должны предоставить обратный вызов, это функция success. Если вы хотите получить эти данные внутри другой функции, просто вызовите эту функцию внутри обратного вызова success.

Ниже приводится код:

//JS1. 
function processResponse(r1, r2) { 
    // do processing here with r1 and r2 
} 

//JS2. 
function methodOfmyJs2() 
{ 
    $.ajax({ 
     type: "GET", 
     data:somedata, 
     dataType: "json", 
     url: "http://127.0.0.1:8000/****/****", 
     success: function(response){ 
      r1=anotherMethodFromThisJS1(response); 
      r2=anotherMethodFromThisJS2(response); 

      //calling the success callback 
      processResponse(r1, r1); 
     } 
    }); 
} 

Там еще один вариант, если вы действительно хотите сделать это, вы можете сделать свой Ajax вызов synchronous, как показано ниже.

$.ajax({ 
    type: "GET", 
    url: remote_url, 
    async: false,//now call is synchronous 
    success : function (data) { 
    } 
}); 

Теперь jQuery.ajax() будет ждать, пока ответ HTTP прибыл, то вы можете вернуть [r1, r2] из methodOfmyJs2().

Однако вам не следует делать синхронные вызовы, так как поток JS ожидает замораживания пользовательского интерфейса.

+0

Не могли бы вы рассмотреть вопрос снова. Я отредактировал его сейчас правильно. Зори для невменяемого. –

0

$.ajax возвращает promise, которые могут быть прикован с then

function getAjaxOutput() { 
    request1().then(function(data){ 
     // get data from request 1 and pass to request 2 
     return request2(data);   
    }) 
    .then(function(data){ 
    // get data from request2 
    $('#output').text(JSON.stringify(data)); 
    }) 
    return false; 
} 

попробовать это https://jsfiddle.net/je7wf4ww/

и если и хотят, чтобы вернуть обычный результат от getAjaxOutput - и просто не может (без запроса синхронизации конечно) - вам нужно возвратить обещание, которое является оберткой вокруг вызова ajax и снова подключить его к then

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