document.getElementById (). value не возвращает правильное значение - PullRequest
1 голос
/ 31 октября 2019

Я пытаюсь создать поле ввода на планшете робота Pepper, которое позволяет пользователю вводить свой адрес электронной почты голосом. Я использую окно распознавания речи, чтобы получить букву, которую произносит пользователь, и вызвать событие, чтобы Javascript мог его перехватить и изменить текст. Но кажется, что «document.getElementById (« abc »). Value» никогда не получит то, что в данный момент находится на экране, но значение по умолчанию.

Пример: я говорю «1», он показывает «hello1» (полностью)хороший). Затем я говорю «2», он показывает «hello2» (Ожидается «hello12»)

Вот мой код JS:

var session = new QiSession(function(session) {
            // "Connection esterblished!";
          }, function() {
            // "Could not connect to the robot";
          });

// Subscribe to ALMemory Service   
session.service("ALMemory").then(function(ALMemory) {
  // "ALMemory proxy subscription successful!";  
  ALMemory.getData('voice_input').then(function(voice_input){  
        document.getElementById("abc").value += voice_input;        
  });

});

HTML-код:

<input type="text" name="email" id="abc" value="hello">

Есть ли какое-то отношение к «сессии»? Потому что даже если я использую глобальную переменную для хранения голосовых входов, я могу только изменить значение этой переменной, но не могу получить текущее значение этой переменной внутри функции (что я могу получить, это инициализированное значение).

1 Ответ

0 голосов
/ 31 октября 2019

К сожалению, мне не удалось найти соответствующую общедоступную документацию по JavaScript API. Однако это то, что я смог найти.

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

var session = new QiSession(function(session) {
    // "Connection esterblished!";
    // Subscribe to ALMemory Service
    session.service("ALMemory").then(function(ALMemory) {
        // "ALMemory proxy subscription successful!";
        function getVoice() {
            ALMemory.getData('voice_input').then(function(voice_input){
                document.getElementById("abc").value += voice_input;
                getVoice();
            });
        }
        getVoice();
    });
}, function() {
    // "Could not connect to the robot";
});

Во-первых, я переместил подписчика службы в обратный вызов для успешного соединения QiSession, потому что именно в этом случае сеанс определяется в вызове асинхронной функции. Когда на ALMemory была подписана, она определяет и вызывает getVoice, который получает речь пользователя, добавляет к полю и затем снова запускает getVoice, чтобы поставить в очередь другое прослушивание. Вы можете добавить условное условие, чтобы остановить его в конце концов. Может также стоить изучить async / await, если Pepper поддерживает это, потому что тогда вы можете легко сделать это с помощью цикла while.

...