如何使用同步XmlHttpRequest等待特定的响应?

时间:2019-02-04 08:58:21

标签: javascript xmlhttprequest synchronous

脚本第一次等待响应而没有任何问题,但是此后每次,即使响应的长度不等于> = 2,它也只是连续的。

我目前正在使用运行JavaScript网络服务器的phantomJS脚本,该脚本有时需要用户输入。因此,我使用Slack API发送了一条消息,并使用一个同步的XmlHttpRequest等待用户的答复以接收所请求的值。 (据我所知,由于内置了phantomJS网络服务器,因此没有其他选择)

ts 是松弛的时间戳,就像唯一标识符

响应是网络服务器响应

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;

0 个答案:

没有答案