2015-01-19 4 views
0

Я пытаюсь сделать вызов ajax, который получает тип свойства. Используя этот тип, я передаю его другому вызову ajax. У меня возникают трудности с этим асинхронно, потому что я пытаюсь отложить до того, как будет загружено первое свойство.Вызов ajax внутри ajax

function getEnt_PodType() { 
    var ent_PodType; 
    var oDataUrl = //URL to my data; 
    return $.ajax({ 
     url: oDataUrl, 
     type: "GET", 
     async: true, 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("ACCEPT", accept); 
     }, 
     success: function (xhr, textStatus) { 
      var res = xhr; 
      if (res.d.results != undefined) { 
       ent_PodType = res.d.results[0].Ent_PodType; 
      } 
      console.log("The ent pod type value is "+ ent_PodType); 
      return ent_PodType; 
     } 
    }); 
} 

function getProjects() { 

    var QUERY_FILTER = getEnt_PodType().done(function (result) { 
     "$filter=Ent_PodType eq '" + result + "'"; 
    }); 

    var url = restUrl + QUERY_FILTER; 

    console.log("The url form getProjects is " + QUERY_FILTER); 

    return $.ajax({ 
     url: url, 
     type: "GET", 
     async: true, 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("ACCEPT", accept); 
     }, 
     success: function (xhr, textStatus) { 
      projects = parseODataResultTest(xhr); 
      return projects; 
     } 
    }); 

} 

Когда я называю getProjects(), я думал, что строительство URL будет ждать getEnt_PodType() для возврата его стоимости, но это, кажется, не работает.

Вместо этого он идет вперед и выполняет остальные функции getProjects(). Есть ли способ сделать это асинхронно?

+0

Вам нужно сделать второй вызов AJAX внутри функции '.done()'. – Barmar

+0

В отличие от сайтов на форуме, мы не используем «Спасибо», или «Любая помощь оценена», или подписи на [so]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be -removed-from-posts). BTW, это «Спасибо заранее», а не «Спасибо в продвинутом». –

ответ

1

AJAX является асинхронным. Все, что зависит от результата, должно выполняться в функции обратного вызова.

Я также рекомендую всегда передавать параметры в качестве объекта, чтобы позволить jQuery правильно кодировать его.

function getProjects() { 

    getEnt_PodType().done(function (result) { 
     var QUERY_FILTER = { "$filter": "Ent_PodType eq '" + result + "'"}; 

     console.log("The url form getProjects is " + QUERY_FILTER); 

     return $.ajax({ 
      url: restUrl, 
      data: QUERY_FILTER, 
      type: "GET", 
      async: true, 
      beforeSend: function (xhr) { 
       xhr.setRequestHeader("ACCEPT", accept); 
      }, 
      success: function (xhr, textStatus) { 
       projects = parseODataResultTest(xhr); 
       return projects; 
      } 
     }); 
    }); 



} 
+0

Результат в getEnt_PodType(). done (функция (результат) возвращается как [объект Object]. правильно выполнить в методе getEnt_PodType.Почему он возвращает [object Object]? –

+0

Похоже, сервер AJAX возвращает JSON, а не строку. – Barmar

0

Звонок ajax должен быть в обещании done. Что-то вроде следующего должно быть в порядке.

function getProjects() { 

    return getEnt_PodType().done(function (result) { 
     var QUERY_FILTER = "$filter=Ent_PodType eq '" + result + "'"; 
     var url = restUrl + QUERY_FILTER; 

     console.log("The url form getProjects is " + QUERY_FILTER); 

     return $.ajax({ 
      url: url, 
      type: "GET", 
      async: true, 
      beforeSend: function (xhr) { 
       xhr.setRequestHeader("ACCEPT", accept); 
      }, 
      success: function (xhr, textStatus) { 
       projects = parseODataResultTest(xhr); 
       return projects; 
      } 
    }); 
    }); 

} 
0

Для этой работы вам необходимо позвонить второй код из функции успеха первого code.Or вы положили код в функции и вызвать эту функцию от успеха обратного вызова первого АЯКСА call.Using .done calllback более уместен. Так называемая вторая функция от выполненного обратного вызова первого вызова ajax.

function getProjects() { 

    return getEnt_PodType().done(function (result) { 
     var QUERY_FILTER = "$filter=Ent_PodType eq '" + result + "'"; 
     var url = restUrl + QUERY_FILTER; 

     console.log("The url form getProjects is " + QUERY_FILTER); 

     return $.ajax({ 
      url: url, 
      type: "GET", 
      beforeSend: function (xhr) { 
      xhr.setRequestHeader("ACCEPT", accept); 
     }, 
     success: function (xhr, textStatus) { 
      projects = parseODataResultTest(xhr); 
      return projects; 
     } 
    }); 

    }); 

} 
1

Ваш второй вызов ajax необходимо разместить внутри обещания. Вы можете обернуть остальную часть вашего кода в локальной функции и вызвать ее внутри сделано, например, так:

function getProjects() { 

    function getProjectsViaAjax(){ 
    var url = restUrl + QUERY_FILTER; 

    console.log("The url form getProjects is " + QUERY_FILTER); 

    return $.ajax({ 
     url: url, 
     type: "GET", 
     async: true, 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("ACCEPT", accept); 
     }, 
     success: function (xhr, textStatus) { 
      projects = parseODataResultTest(xhr); 
      return projects; 
     } 
     }); 
    }; // end of getProjectsViaAjax 

    var QUERY_FILTER = getEnt_PodType().done(function (result) { 
     "$filter=Ent_PodType eq '" + result + "'"; 
     getProjectsViaAjax(); 
    }); 

} 
-1

Вы должны вызвать одну функцию синхронно, потому что вторая задача зависит от первой задачи. Вы можете вызвать функцию getEnt_PodType синхронно, вам нужно сделать
async: false в этой функции. И тогда он будет работать так, как вы ожидали.

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