正在将超时设置为fs.copy函数


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循环中使用了这个等待函数,在这个循环中,我需要从源目录将一些文件复制到多个网络目录,然而,等待的问题是,对于失败的目录,它几乎需要一分钟的时间来解决,然后将控制权交还给下一次迭代,有没有办法在5秒后停止当前迭代。

您可以向任何类似这样的承诺添加错误超时:

// 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上使用的内容。如果超时成功,则promise将被拒绝。

相关内容

  • 没有找到相关文章

最新更新