我自动生成文件,并且我有另一个脚本来检查是否已经生成了给定文件,所以我该如何实现这样的功能:
function checkExistsWithTimeout(path, timeout)
将检查路径是否存在,如果不存在,则等待它,util timeout。
答案 0 :(得分:7)
假设您计划使用Promises
,因为您没有在方法签名中提供回调,您可以检查该文件是否存在并同时查看该目录,然后解析该文件是否存在,或者在超时发生之前创建文件。
function checkExistsWithTimeout(filePath, timeout) {
return new Promise(function (resolve, reject) {
var timer = setTimeout(function () {
watcher.close();
reject(new Error('File did not exists and was not created during the timeout.'));
}, timeout);
fs.access(filePath, fs.constants.R_OK, function (err) {
if (!err) {
clearTimeout(timer);
watcher.close();
resolve();
}
});
var dir = path.dirname(filePath);
var basename = path.basename(filePath);
var watcher = fs.watch(dir, function (eventType, filename) {
if (eventType === 'rename' && filename === basename) {
clearTimeout(timer);
watcher.close();
resolve();
}
});
});
}
答案 1 :(得分:2)
fs.watch() API就是您所需要的。
在使用之前,请务必阅读其中提到的所有注意事项。
答案 2 :(得分:1)
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean | UrlTree> | Promise<boolean | UrlTree> | boolean | UrlTree {
return this.service.checkSesh();
}
答案 3 :(得分:0)
以下是解决方案:
// Wait for file to exist, checks every 2 seconds
function getFile(path, timeout) {
const timeout = setInterval(function() {
const file = path;
const fileExists = fs.existsSync(file);
console.log('Checking for: ', file);
console.log('Exists: ', fileExists);
if (fileExists) {
clearInterval(timeout);
}
}, timeout);
};
答案 4 :(得分:0)
如果您有节点6或更高版本,则可以像这样实现它。
const fs = require('fs')
function checkExistsWithTimeout(path, timeout) {
return new Promise((resolve, reject) => {
const timeoutTimerId = setTimeout(handleTimeout, timeout)
const interval = timeout / 6
let intervalTimerId
function handleTimeout() {
clearTimeout(timerId)
const error = new Error('path check timed out')
error.name = 'PATH_CHECK_TIMED_OUT'
reject(error)
}
function handleInterval() {
fs.access(path, (err) => {
if(err) {
intervalTimerId = setTimeout(handleInterval, interval)
} else {
clearTimeout(timeoutTimerId)
resolve(path)
}
})
}
intervalTimerId = setTimeout(handleInterval, interval)
})
}
答案 5 :(得分:-1)
result
答案 6 :(得分:-2)
这非常黑客,但适用于快速的东西。
function wait (ms) {
var now = Date.now();
var later = now + ms;
while (Date.now() < later) {
// wait
}
}