К сожалению, мне не удалось найти соответствующую общедоступную документацию по 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.