2013-07-04 1 views
0

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

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

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

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

+0

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

ответ

0

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

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()) 

, который ничего не принесет пользы. Думаю об этом.

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

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