2013-12-23 1 views
0
function processData(data) { 
    //some processing 
    return data; 
} 
function test() { 
    $.ajax({ 
     'url': api1, 
     'data': { 
      'use': "200" 
     }, 
     'dataType': 'json' 
    }).done(function (data) { 
     $.ajax({ 
      'url': api2, 
      'data': { 
       'use': data.ud; 
      }, 
      'dataType': 'json' 
     }).done(function (data) { 
      processData(data); 
     }); 
    }); 
return; 
} 
function main() { 
    test.done(function (data) { 
     parse(data); 
    }); 
} 

Я хочу дождаться окончания вложенного ajax в test() перед возвратом. aync = false - это один из способов, но, как утверждают некоторые, это нехороший вариант. Что может быть хорошим решением для этого.как остановить возврат из функции js до полного окончания ajax

1) Результат одного AJAX используется в другом вызове в качестве входных данных так, когда() не может быть использован, которые выполняют называют параллельными

2) Возвращение будут выполнены, прежде чем второй Аякса полный и его обратный вызов выполняется. Конечно, 2-й вызов ajax будет выполнен, но до того, как этот тест будет возвращен, и его выполнение вызывается из основного.

+0

Перестановка код так, что синтаксический анализ называется внутри обработчика успеха второго запроса AJAX? –

ответ

0

Вы можете использовать jQuery.when().

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

0

Вам необходимо вернуть ajax звонок из теста и использовать его с помощью вызова.

function test() { 
    $.ajax({ 
     'url': api1, 
     'data': { 
      'use': "200" 
     }, 
     'dataType': 'json' 
    }).done(function (data) { 
     return $.ajax({ 
      'url': api2, 
      'data': { 
       'use': data.ud; 
      }, 
      'dataType': 'json' 
     }); 
    }); 
} 

function main() {   
    test.done(function (data) { 
     processData(data); 
     parse(data); 
    }); 
} 
0

async: false плохая идея, потому что Аякса не предназначена для блокирования. Без async: false вы не можете остановить функцию от возврата. Лучшим решением будет использование объекта Deferred. Вы можете улучшить код таким образом.

function processData(data) { 
    return data; 
} 

function test() { 
    // what is being returned here is a deferred object 
    // see http://api.jquery.com/deferred.then/ 
    return $.ajax().then(function (data) { 
    return $.ajax().then(function (data) { 
     return processData(data); 
    }); 
    }); 
} 

function main() { 
    // you can't stop test from returning, but you can used the return Deferred object 
    test().done(function (finalData) { 
    // processData(data) in test will be available as `finalData` here 
    }); 
} 
0

Я рекомендую вам попробовать этот jQuery-плагин, созданный мной. Надеюсь, это может сделать цепочку вызовов ajax проще. jQuery.chain

$.chain(ajaxfunc,parse, processData).then(success, failure);

вы можете найти демо here

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