将文件复制功能设置超时

问题描述 投票:1回答:1
      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));
}

我正在for循环中使用此await函数,在该循环中,我需要从源目录中将一些文件复制到多个网络目录中,但是await的问题在于该目录失败了,几乎要花一分钟的时间才能解决然后将控制权交还给下一个迭代,有没有一种方法可以让我们在5秒钟后停止当前的迭代。

javascript node.js file async-await timeout
1个回答
1
投票

您可以向任何承诺添加错误超时,如下所示:

// 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)]);
}

The,您可以像这样将其与fs.copy()一起使用:

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

因此,如果fs.copy()花费的时间超过5秒,则您正在等待的诺言将被拒绝,您可以将其捕获到catch处理程序中并采取相应的措施。您将能够看到错误对象具有.timeout属性。

此工作方式是timeout()函数在您传入的诺言与超时到期后将拒绝的另一个诺言之间形成竞争。第一个完成的控件控制Promise.race()的输出,从而控制您在await上使用的内容。如果超时获胜,那么承诺将被拒绝。

© www.soinside.com 2019 - 2024. All rights reserved.