разрешить/отклонить обещание jquery в другой функции

Я пытаюсь найти способ разрешить/отклонить обещание jquery в функции, которая недоступна напрямую для функции, создающей обещание/отложенное.

Сценарий — это когда запрос отправляется на другую машину, а ответ на него (который может прийти или не прийти) обрабатывается другой функцией. Как только я отправляю запрос, я запускаю таймер, который отклоняет обещание по тайм-ауту. Чтобы разрешить/отклонить обещание позже на основе ответа с удаленной машины, я делаю это обещание доступным как для функций запроса на отправку, так и для ответа на получение (где оно разрешается, если ответ был успешным), однако, если код, который вызывает функция отправки запросов пытается отправить несколько запросов, это не сработает.

В основном я хотел бы разрешить/обработать только один запрос за раз, пока этот запрос не будет разрешен или отклонен, даже если вызывающий код пытается отправить несколько запросов. Любые идеи о том, как этого добиться?

Извините, если я звучу повсюду, я довольно новичок в этом деле.


person source.rar    schedule 04.07.2013    source источник
comment
Похоже, у вас что-то не так в голове. В частности, если запрос сделан правильно (с помощью jQuery.ajax(...) или одного из его сокращенных методов), то все разрешение/отклонение будет управляться за вас с помощью jQuery. Все, что вам нужно сделать, это указать обработчики успеха/ошибки одним или несколькими различными способами, и они сработают, когда придет ответ или истечет время ожидания запроса. Опубликуйте код, и я уверен, что кто-то сможет посоветовать дальше.   -  person Beetroot-Beetroot    schedule 05.07.2013


Ответы (1)


Если я правильно понимаю ваш вопрос, вам нужно настроить удаленную сторону для возврата обещания, а затем вызвать эту процедуру и вернуть ее значение из обработчика на локальной стороне:

 Promise
    .when (ready_for_remote_call)
    .then (function () {return remote_action_returning_promise ();})
    .then (
        function () {console.log("remote succeeded");},
        function () {console.log("remote failed");}
    )
;

Обратите внимание, что это можно упростить как

    .then (remote_action_returning_promise)

который полностью отличается от

    .then (remote_action_returning_promise())

что не принесет ничего полезного. Подумай об этом.

Это аспект обещаний, который немного сложно уложить в голове. Обработчики могут возвращать промисы, которые затем как бы «вставляются» в цепочку промисов. Спецификация использует выражение, что промис «принимает состояние» возвращенного промиса. Конкретно это означает, что если возвращенное обещание выполнено, вызывающее обещание будет выполнено; если возвращенное обещание отклонено, вызывающее обещание будет отклонено.

Другими словами, не думайте об этом как о том, что удаленная сторона каким-то образом отклоняет обещание на локальной стороне; думайте об этом как о возвращении обещания, которое, если оно будет вызвано в качестве обработчика, примет состояние локального обещания.

person Community    schedule 05.07.2013