Установка времени ожидания для функции fs.copy - PullRequest
1 голос
/ 10 апреля 2020
      global.resultArr = {};
      global.failedArr = [];
      global.successArr = [];    
       const writeFile = async function (dirResult, queryResult) {
  for (i = 0; i < queryResult.recordset.length; i++) {
    for (file of dirResult) {
      if (
        file.substring(file.length - 3) == "wav" &&
        global.failedArr.indexOf(queryResult.recordset[i].ip_vch) == -1
      ) {
        try {
          const writeResult = await timeout(
            fs.copy(
              dir + "//" + file,
              "//" +
                queryResult.recordset[i].ip_vch +
                "//RXWaveFiles//DynamicLibraries" +
                "//" +
                libid +
                "//" +
                file
            ),
            5000
          );
          if (
            writeResult &&
            global.failedArr.indexOf(queryResult.recordset[i].ip_vch) == -1
          ) {
            console.log(queryResult.recordset[i].ip_vch);
            global.failedArr.push(queryResult.recordset[i].ip_vch);
            await sql.query`update opower..dialers set fileMoveResult_int=0 where ip_vch =${queryResult.recordset[i].ip_vch}`;
          } else if (
            global.successArr.indexOf(queryResult.recordset[i].ip_vch) == -1 &&
            global.failedArr.indexOf(queryResult.recordset[i].ip_vch) == -1
          ) {
            global.successArr.push(queryResult.recordset[i].ip_vch);
            await sql.query`update opower..dialers set fileMoveResult_int=1 where ip_vch =${queryResult.recordset[i].ip_vch}`;
            console.log("success!" + queryResult.recordset[i].ip_vch);
          }
        } catch (error) {
          console.error(error);
          if (global.failedArr.indexOf(queryResult.recordset[i].ip_vch) == -1) {
            global.failedArr.push(queryResult.recordset[i].ip_vch);
            await sql.query`update opower..dialers set fileMoveResult_int=0 where ip_vch =${queryResult.recordset[i].ip_vch}`;
          }
        }
      }
    }
  }
  global.resultArr.success = successArr;
  global.resultArr.failed = failedArr;
  return global.resultArr;
};

    // utility function that creates a promise that rejects after a certain time
    function timeoutPromise(t, errMsg = "timeout") {
        // create possible error object here to get appropriate stack trace
        let e = new Error(errMsg);
        e.timeout = true;
        return new Promise((resolve, reject) => {
            setTimeout(reject, t, e);
        });
    }

// wrap a promise with a timeout, pass promise, time in ms and 
// optional timeout error message
function timeout(p, t, errMsg = "timeout") {
    return Promise.race(p, timeoutPromise(t, errMsg));
}

Я использую эту функцию await в a для l oop, в которой из исходного каталога мне нужно скопировать некоторые файлы в несколько сетевых каталогов, однако проблема с await заключается в том, что для каталогов происходит сбой это занимает почти минуту, а затем возвращает элемент управления для следующей итерации, есть ли способ остановить текущую итерацию через 5 секунд.

1 Ответ

1 голос
/ 10 апреля 2020

Вы можете добавить время ожидания ошибки к любому обещанию, как это:

// utility function that creates a promise that rejects after a certain time
function timeoutPromise(t, errMsg = "timeout") {
    // create possible error object here to get appropriate stack trace
    let e = new Error(errMsg);
    e.timeout = true;
    return new Promise((resolve, reject) => {
        setTimeout(reject, t, e);
    });
}

// wrap a promise with a timeout, pass promise, time in ms and 
// optional timeout error message
function timeout(p, t, errMsg = "timeout") {
    return Promise.race([p, timeoutPromise(t, errMsg)]);
}

. Вы можете использовать это с вашим fs.copy() следующим образом:

const writeResult = await timeout(fs.copy(...), 5000);

Итак, тогда если fs.copy() занимает более 5 секунд, ожидаемое вами обещание будет отклонено, и вы можете перехватить его в обработчике catch и действовать соответственно. Вы увидите, что у объекта ошибки есть свойство .timeout.

Способ, которым это работает, заключается в том, что функция timeout() создает гонку между обещанием, которое вы передали, и другим обещанием, которое будет отклонено после Ваш тайм-аут истекает. Первый завершитель контролирует вывод Promise.race() и, следовательно, контролирует то, что вы используете await. Если тайм-аут выигрывает, то обещание будет отклонено.

...