Nodejs, как мне дождаться завершения предыдущего запроса на публикацию. Ниже приведен фрагмент:

var data ="xxxx"
let XMLHttpRequest1 = require("xmlhttprequest").XMLHttpRequest;
var xhr = new XMLHttpRequest1();
xhr.withCredentials = true;
xhr.open("POST", https://corpqa.sts.xxxx.com/adfs/oauth2/token);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);
console.log("Execution Order 1");
xhr.addEventListener("readystatechange",  function() {
  if(this.readyState === 4) {
    console.log("Execution Order 2");
    //console.log(this.responseText);

  }
});
console.log("Execution Order 3");

В NodeJS ниже приведен результат вышеприведенного кода:

Execution Order 1
Execution Order 3
Execution Order 2

Как сделать код для WAIT ответа, выполнить this.readyState === 4. перед тем, как перейти к выполнению console.log («Порядок выполнения 3»).

Ожидаемый вывод

Execution Order 1
Execution Order 2
Execution Order 3
0
Madhu 12 Июн 2021 в 21:59

3 ответа

Лучший ответ

Сделайте обещанную версию http-запроса. Может принимать необязательный параметр authToken.

const XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;

// return a promise to post data to url
async function post(url, data, authToken) {
  const request = new XMLHttpRequest();
  
  requst.open("POST", url);
  request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  if (authToken) {
    request.withCredentials = true;
    // request.setRequestHeader( ...set an auth header with authToken
  }
  request.send(data);

  return new Promise((resolve, reject) => {
    request.addEventListener("readystatechange", () => {
      console.log("during the request");
      if (request.readyState === 4 && request.status === 200) resolve();
    });
    // todo: error handling
  });
}

Назовите это так:

async function orderOfOperationTest() {
  const data ="xxxx"
  const url = "https://corpqa.sts.xxxx.com/adfs/oauth2/token"
  console.log("before the credential request");
  const authToken = await post(url, data); // notice 'await'
  console.log("after the credential request");
  // now pass authToken as the 3rd param to the next call of 'post()'
}
1
danh 12 Июн 2021 в 19:43

Javascript - синхронный язык. Он выполнит все строки и сохранит эти функции обратного вызова во внутренней очереди до тех пор, пока не будет вызван.

// the second parameter define the callback function. 
xhr.addEventListener("readystatechange",  function() {
      if(this.readyState === 4) {
        console.log("Execution Order 2");
        //console.log(this.responseText);
    
      }
    });

Чтобы иметь неблокирующее ожидание readyState == 4, вам нужно будет поместить его в функцию обратного вызова, подобную этой.

xhr.addEventListener("readystatechange",  function() {
      if(this.readyState === 4) {
        console.log("Execution Order 2");
        //console.log(this.responseText);
        console.log("Execution Order 3");
    
      }
    });
0
j.f. 12 Июн 2021 в 19:10

Используйте async / await.
Например:

  1. firstTask ()
  2. ждать secondTask ()
  3. ThirdTask ()
    Выполнение будет ждать завершения «secondTask» перед выполнением третьей задачи.
async function doSomething() {
  try{
    firstTask();
    await callAPI(options); // options with POST operations
    thirdTask();
  }catch(error){
    console.log("error occured ", error);
  }
}
0
Lawrence Cherone 12 Июн 2021 в 19:40