Можно ли ожидать обратного вызова JavaScript?

Только для получения значения строки версии ОС:

[[UIDevice currentDevice] systemVersion]
22
задан Aligned 12 January 2009 в 19:13
поделиться

6 ответов

jConfirm('are you sure?', 'Confirmation Dialog',
    function(r) {
        result = r;
        response = true;
        return r;
    }
);
if (response == true) {

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

  1. jConfirm называют, получая функцию как один из ее параметров, которые это помнит.
  2. jConfirm отображает свой UI на странице и возвратах сразу.
  3. , 'если (ответ == верный)' строка выполняется. Действительно это должно просто читать, 'если (ответ)', булево сравнение является лишним. Но в любом случае ответ является, конечно, ложью. Ваша функция сдается и выходит, отдавая управление к браузеру.
  4. пользователь нажимает UI jConfirm.
  5. jConfirm только теперь вскакивает в действие и отзывает функцию, которую Вы дали ему, и это помнило ранее.
  6. Ваша вложенная функция устанавливает верный ответ, слишком поздно для 'если (ответ == верный)' условие сделать что-либо с ним.

Вы записали "//, ожидают ответа" как альтернатива, но нет никакого кода JavaScript, можно записать, что это на самом деле сделает это. Ваша функция должна возвратиться для давания контроля назад к браузеру, прежде чем браузер сможет запустить события щелчка в jConfirm UI, которые заставляют обработку продолжиться.

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

16
ответ дан bobince 29 November 2019 в 04:20
поделиться

Вы только что поразили большое ограничение в JavaScript. Как только Ваш код вводит асинхронный мир, нет никакого способа возвратиться к классическому процедурному потоку выполнения.

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

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

function confirm(fnCallback) 
{
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) 
    {
        // Do something with r 

        fnCallback && fnCallback(r); // call the callback if provided
    });
}

// in the caller

alert('begin');

confirm(function(r)
{
    alert(r);

    alert('end');
})
19
ответ дан Vincent Robert 29 November 2019 в 04:20
поделиться

Так как обратный вызов является асинхронным (по крайней мере, в том смысле, что он ожидает на пользователе, чтобы сделать что-то), могло бы быть легче обработать то, что Вам нужен к внутренней части обратный вызов:

function confirm() {
    jConfirm('are you sure?', 'Confirmation Dialog', function(r) {
        if (r) doSomething();
    });
}
<час>

@klogan [комментарии]

я предполагаю, что Вы получили их от здесь ?

страница дает Вам Ваш ответ: (посмотрите под [1 120] Использование )

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

<час>

@klogan

мнение, которое я пытаюсь высказать, - то, что нет действительно простого способа выполнить то, что Вы хотите. Вы пытаетесь коррелировать процедурный и событийно-ориентированный программирование - что-то, что JavaScript не помогает Вам сделать.

<забастовка> самое простое (хотя, опасный ) решение состоит в том, чтобы использовать псевдобесконечный цикл. Но, если callback никогда не называется, у Вас теперь есть фактический бесконечный цикл. И, в зависимости от механизма JavaScript, Вы могли бы уничтожить ожидание браузера.

Точка: Ваш лучший выбор состоит в том, чтобы избежать <забастовка> это попытка вызвать событийно-ориентированный в процедурный.

function confirm() {
    var result = false;
    var response = false;

    jConfirm('are you sure?', 'Confirmation Dialog',
      function(r) {
        result = r;
        response = true;
    });

    while(!response) continue; // wait
    return result;
}

8
ответ дан Jonathan Lonowski 29 November 2019 в 04:20
поделиться

Технически, да , но я не сделал бы этого на веб-сайте.

Смотрят на рассказ JavaScript , который базируется прочь Narcissus.

Рассказ JavaScript является маленьким расширением языка сценариев JavaScript, который включает запирающие способности для асинхронных обратных вызовов события. Это делает асинхронный код освежающе читаемым и понятным.

Селен использование эта технология.

<час>

Обновление

Выезд Скрутки JavaScript :

Скрутки JavaScript добавляет сопрограмму и совместную поддержку поточной обработки языку сценариев JavaScript для включения запирающих способностей для асинхронных обратных вызовов события. Это делает код, который использует асинхронную операцию, намного более линейную, читаемую, и управляемую. Скрутки создаются на Рассказе JavaScript, записанный Neil Mix и большой частью Рассказа, которым JavaScript остался в Скрутках включая большую часть этой документации.

В JavaScript Ваш код не может просто ожидать, пока событие не стреляло - событие должно всегда обрабатываться отдельным, асинхронным обработчиком событий. Иногда это прекрасно, но это часто вызывает то, что должно быть простой последовательностью операторов в непростые искривления. Это также повреждает способность инкапсулировать функциональность, потому что вызывание функций должно знать для обеспечения обработчика обратного вызова. Скрутки обеспечивают способность приостановить и возобновить потоки выполнения. Выполнение может приостановить резюме, когда событие закончено. Это позволяет Вам писать трудно к чтению асинхронную обработку событий в простом, линейном, читаемом коде, который инкапсулирует реализацию.

5
ответ дан Greck 29 November 2019 в 04:20
поделиться

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

function confirm() {
        var response = jConfirm('are you sure?', 'Confirmation Dialog');
        if (response) {
            alert(result);
        }
        else {
            //wait for response
            alert('hi');
        }
    }
0
ответ дан Diodeus - James MacFarlane 29 November 2019 в 04:20
поделиться

Я думаю, что предложил возможное решение этой проблемы. Я читал эту статью: http://treasure4developer.wordpress.com/2008/06/23/calling-postback-event-from-javascript/

В основном идея состоит в том, что Вы вынуждаете обратную передачу покинуть JavaScript, сначала я нашел, что обратная передача будет работать, но не назвала бы мое событие кнопки, но после чтения статьи, я нашел, что мог обнаружить, если бы это была обратная передача JavaScript, и просто назовите метод, чтобы сделать обработку

DotnetShadow

Отношений
0
ответ дан 29 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: