Создание кнопки отмены ... как полностью прервать запрос в Node / Express.js - PullRequest
1 голос
/ 28 апреля 2019

Я хочу создать кнопку «Отмена» в моем приложении.Запрос, который кнопка должна отменить, содержит Promise.all, выполнение которого обычно занимает несколько минут из-за ограничения скорости API на другом конце.

Если у меня есть такой маршрут:

router.get('/api/my_route', (req, res, next) => {

//imagine this takes about 2 minutes to complete and send back the 200.
//The user changes their mind and wants to cancel it at the 1 minute mark.

  fetch("https://jsonplaceholder.typicode.com/albums")
    .then(first_response => first_response.json())
    .then(arr => Promise.all(arr.map(item => 
       fetch("https://jsonplaceholder.typicode.com/users")
       .then(second_response => second_response.json())
       .then(value => console.log(value))
      )))
    .then(() => {
        res.status(200);   
    });
});

Как вы можете отменить это и полностью прервать его во время выполнения запросов Promise?

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Вы бы использовали AbortController, чтобы прервать запросы на выборку и прослушать событие close для запроса о том, что клиент закрыл соединение:

router.get('/api/my_route', (req, res, next) => {
  // we create a new AbortController to abort the fetch request
  const controller = new AbortController();
  const signal = controller.signal;

  req.on('close', err => { // if the request is closed from the other side
    controller.abort(); // abort our own requests
  })


  fetch("https://jsonplaceholder.typicode.com/albums", {signal})
    .then(first_response => first_response.json())
    .then(arr => Promise.all(arr.map(item => 
       fetch("https://jsonplaceholder.typicode.com/users", {signal})
       .then(second_response => second_response.json())
       .then(value => console.log(value))
      )))
    .then(() => {
        res.status(200);
    });
});
0 голосов
/ 28 апреля 2019

Сами обещания не имеют механизма отмены.Вы можете отправить другой запрос API на удаленный сервер, чтобы отменить исходный запрос, но если он ограничен по скорости, он предполагает, что это старый сервер, который может быть нелегко изменить.

...