将超时设置为 fs.copy 函数
问题global.resultArr = {};
global.failedArr = [];
global.successArr = [];
const writeFile = async function (dirResult, queryResult) {
queryResult.recordset.forEach((ip_vch, index) => {
for (file of dirResult) {
if (
file.substring(file.length - 3) == "wav" &&
global.failedArr.indexOf(ip_vch.ip_vch) == -1
) {
try {
writeResult = await timeout(
fs.copy(
dir + "//" + file,
"//" +
ip_vch.ip_vch +
"//RXWaveFiles//DynamicLibraries" +
"//" +
libid +
"//" +
file
),
8000
);
Promise.all()
.then(function (values) {
console.log(values);
if (
writeResult &&
global.failedArr.indexOf(ip_vch.ip_vch) == -1
) {
console.log(ip_vch.ip_vch);
global.failedArr.push(ip_vch.ip_vch);
sql.query`update opower..dialers set fileMoveResult_int=0 where ip_vch =${ip_vch.ip_vch}`;
} else if (
global.successArr.indexOf(ip_vch.ip_vch) == -1 &&
global.failedArr.indexOf(ip_vch.ip_vch) == -1
) {
global.successArr.push(ip_vch.ip_vch);
sql.query`update opower..dialers set fileMoveResult_int=1 where ip_vch =${ip_vch.ip_vch}`;
console.log("success!" + ip_vch.ip_vch);
}
})
.catch((err) => console.error(err));
} catch (error) {
console.error(error);
if (global.failedArr.indexOf(ip_vch.ip_vch) == -1) {
global.failedArr.push(ip_vch).ip_vch;
sql.query`update opower..dialers set fileMoveResult_int=0 where ip_vch =${ip_vch.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 秒后停止当前迭代。
回答
您可以为以下任何 Promise 添加错误超时:
// 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();
}
,您可以将它与 fs.copy() 一起使用,如下所示:
const writeResult = await timeout(fs.copy(...), 5000);
因此,如果 fs.copy() 花费的时间超过 5 秒,您正在等待的承诺将被拒绝,您可以在 catch 处理程序中捕获它并采取相应的行动。您将能够看到错误对象具有 .timeout 属性。
它的工作方式是 timeout() 函数在传入的 Promise 和另一个将在超时后被拒绝的 Promise 之间创建竞争。第一个完成的控件控制 Promise.race() 的输出,而后者又控制您在其上使用的 await 的内容。如果超时成功,则 Promise 将被拒绝。
页:
[1]