Как установить ограничение по времени для метода в NodeJs? - PullRequest
1 голос
/ 04 августа 2020
• 1000 где внешний вызов API иногда занимает слишком много времени, чтобы вернуть ответ,
закрывает мой код для разрыва, будучи бессерверной функцией

Поэтому я хочу установить ограничение по времени для внешнего API call,
Где, если я не получу от него ответа в течение 3 секунд, я буду sh код, чтобы корректно остановить дальнейший процесс

Ниже приводится псевдокод того, что Я пытаюсь это сделать, но не могу понять лог c -

let test = async () => {
    let externalCallResponse = '';

    await setTimeout(function(){ 

        //this call sometimes takes for ever to respond, but I want to limit just 3secs to it
        externalCallResponse = await externalCall();
    }, 3000);

    if(externalCallResponse != ''){
        return true;
    }
    else{
        return false;
    }
}

test();

Ссылка -
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/SSM.html#getParameters -свойство
Я использую AWS метод getParameters SSM

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Вы можете сделать что-то вроде этого:

const timeout = async (func, millis) => {
   return new Promise(async (resolve, reject) => {
      setTimeout(() => reject(), millis);

      resolve(await func());
   });
}

timeout(() => doStuff(), 3000)
   .then(() => console.log('worked'))
   .catch(() => console.log('timed out'));

Тесты:

const timeout = async (func, millis) => {
   return new Promise(async (resolve, reject) => {
      setTimeout(() => reject(), millis);

      resolve(await func());
   });
}

const doStuffShort = async () => { // Runs for 1 second
  return new Promise((resolve) => setTimeout(() => resolve(), 1000));
}

const doStuffLong = async () => { // Runs for 5 seconds
  return new Promise((resolve) => setTimeout(() => resolve(), 5000));
}

timeout(() => doStuffShort(), 3000)
   .then(() => console.log('1 worked'))
   .catch(() => console.log('1 timed out'));
   

timeout(() => doStuffLong(), 3000)
   .then(() => console.log('2 worked'))
   .catch(() => console.log('2 timed out'));
1 голос
/ 04 августа 2020

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

let test = async () => {

    return promiseTimeout()
}

const promiseTimeout = () => {
    return new Promise(async (resolve, reject) => {
        setTimeout(function () {
            let externalCallResponse=""
            externalCallResponse = await externalCall();
            if (externalCallResponse != '') {
                return resolve(true);
            }
            else {
                return resolve(false);
            }
        }, 3000);
    })
}

test().then(result=>{
    console.log(result);
});
1 голос
/ 04 августа 2020

Вы не можете ожидать setTimeout, так как он не возвращает Promise.

Вы можете реализовать функцию, которая возвращает Promise, которое выполняется через 3 секунды.

function timeout(seconds) {
   return new Promise((resolve) => {
       setTimeout(resolve, seconds * 1000)
   });
}

Вы можете ожидать указанную выше функцию в своем коде, передав количество секунд, в течение которых вы хотите ждать

let test = async () => {
    let externalCallResponse = ''; 
    
    setTimeout(async () => {
       externalCallResponse = await externalCall();
    }, 0);

    await timeout(3); // wait for 3 seconds 

    if(externalCallResponse != '') return true;
    else return false;
}

Следующий фрагмент кода демонстрирует использование функции timeout, описанной выше. Он имитирует запрос api, который возвращает ответ через 4 секунды.

function timeout(seconds) {
  return new Promise(resolve => {
    setTimeout(resolve, seconds * 1000);
  });
}

function apiRequest() {
  return new Promise(resolve => {
    setTimeout(() => resolve('Hello World'), 4000);
  });
}

let test = async () => {
  let externalCallResponse = '';

  setTimeout(async () => {
    externalCallResponse = await apiRequest();
  }, 0);

  await timeout(3); // wait for 3 seconds

  if (externalCallResponse != '') return true;
  else return false;
};

test()
  .then(res => console.log(res))
  .catch(err => console.log(err.message));
...