2015-07-21 3 views
0

Из-за (моей воспринимаемой) природы $.ajax GET Я не уверен, что я ищу в этом методе, но думал, что я должен спросить, так как это вызывает у меня проблемы. Я никоим образом не специалист по JS, извиняюсь, если это очевидно, название плохое, не может думать о другом способе сказать это.

Что я делаю - с помощью $.ajax для получения значений из внутренних API-функций API (эти работы). В свойстве success я использую анонимную функцию для передачи большего количества данных, которые иначе не были бы возвращены. При переходе через контрольные точки консоли в консоли Chrome функция успеха часто пропускается, так как она не возвращается достаточно быстро.

То, что я хотел бы - в приведенном ниже примере, я не хочу getStuff завершить до его успеха DoSomething вернулся, так как я не хватает нагрузок данных из API, которые мне нужно пройти, чтобы DoSomething - этого можно достичь?

Пример

function getStuff(id, hid) { 
    $.ajax({ 
     type: "GET", 
     url: "/api/GetMyStuff/" + id, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     success: function (vData) { 
      DoSomething(vData, id, hid); // not always being hit 
     } 
    }); 
} 
+0

Посмотрите на https://api.jquery.com/jquery.when/ –

ответ

2

Вы можете использовать опцию async и установить его на false, чтобы получить синхронный вызов:

function getStuff(id, hid) { 
    $.ajax({ 
     type: "GET", 
     url: "/api/GetMyStuff/" + id, 
     contentType: "application/json; charset=utf-8", 
     dataType: "json", 
     async: false, // HERE 
     success: function (vData) { 
      DoSomething(vData, id, hid); // not always being hit 
     } 
    }); 
} 

Но , что не является хорошим способом сделать Ajax запрос, вы должны пересмотреть свою организацию кода (например, предоставляя функцию обратного вызова вашему методу getStuff и вызывая его в обратном вызове success).

+1

Не вынимайте «a» из ajax. ;-) –

+0

Это обычно нецелесообразно. Это блокирует цикл основного события, который вызывает неудовлетворительное поведение пользователя, когда сам запрос находится в ожидании. – jmar777

+0

@ jmar777 Вот что я сказал в конце моего (обновленного) ответа. – Holt

1

То, что вы пытаетесь сделать, это невозможно. Асинхронность является «негерметичной», что означает, что любое асинхронное действие, требующее обратного вызова (например, $.ajax()), обязательно заставляет асинхронный поток управления вплоть до цепочки вызовов.

Обратите внимание, что в ближайшем будущем (спасибо async/await в ES7), эта ситуация немного улучшится. Асинхронность по-прежнему протекает, но новые ключевые слова делают сценарий рефакторинга немного легче, чем обратные вызовы с подавлением помех во всем мире.

+0

Черт, тогда я подумал, спасибо, где я назвал функцию «DoSomething», это данные из этого анонимного метода потерянный или он будет перенесен позже? Попытка привыкнуть к консоли Chrome и что она может/не может сделать. – PurpleSmurph

+0

Если 'DoSomething()' не всегда вызывается в вашем текущем коде, это, вероятно, означает, что произошла ошибка. Я бы рекомендовал также добавить обработчик 'error: function() {}' в вашу конфигурацию '$ .ajax(). – jmar777

+0

Кажется, что нет - Идентификатор, который был перенесен, и анализируется в функции 'getStuff', работает над вызовом API, если я его напрямую направляю. Будет больше кода обработки ошибок, но это не похоже на проблему. Идентификаторы, которые выходят из строя, случайны, они никогда не совпадают, поэтому я считаю, что вызов ajax заканчивается, прежде чем функция успеет вернуться. – PurpleSmurph

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