Как использовать синхронный XmlHttpRequest для ожидания конкретного ответа? - PullRequest
0 голосов
/ 04 февраля 2019

Сценарий в первый раз ожидает ответа без каких-либо проблем, но каждый раз после этого он просто непрерывный, даже если ответ не имеет длины> = 2.

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

ts - это временная метка, которая похожа на уникальный идентификатор

response - это ответ веб-сервера

var slackGetResponse = function(requestTs) {
  var xhrResp = new XMLHttpRequest();
  xhrResp.onreadystatechange = function() {
    if (xhrResp.readyState == XMLHttpRequest.DONE) {
      var json = JSON.parse(xhrResp.responseText).messages;
      if (json.length >= 2) {
        slackSendMsg("OK", true, requestTs);
        slackResponse = json[1].text;
        return true;
      } else {
        if (rTo < responseTimout) {
          rTo++;
          setTimeout(slackGetResponse(requestTs), 2000);
        } else {
          slackSendMsg('Timeout', true, '');
          response.statusCode = 500;
          response.setHeader('Content-Type', 'application/json');
          response.write(JSON.stringify({
            "status": false,
            "msg": "timeout"
          }));
          response.close();
          return true;
        }
      }
    }
  }
  xhrResp.open("GET", "https://slack.com/api/conversations.replies?token=" + token + "&channel=" + channel + "&ts=" + requestTs + "&pretty=1&limit=1", false);
  xhrResp.send();
}

Отправка первого сообщения:

var slackSendMsg = function(msg, async, threadTs) {
  var xhrMsg = new XMLHttpRequest();
  xhrMsg.onreadystatechange = function() {
    if (xhrMsg.readyState == XMLHttpRequest.DONE) {
      var requestTs = JSON.parse(xhrMsg.responseText).ts;
      if (!async) {
        return slackGetResponse(requestTs);
      }
      return true;
    }
  }
  xhrMsg.open("GET", "https://slack.com/api/chat.postMessage?token=" + token + "&channel=" + channel + "&text=" + msg + "&pretty=1&thread_ts=" + threadTs, async);
  xhrMsg.send();
};

Вот как я вызываю метод во время выполнения:

slackSendMsg('Password Error, please provide *Password* for _' + params.name + '_.', false, '');
credentials.password = slackResponse;
...