@35iter/spider-core
Version:
使用 puppetter-cluster 的爬虫工具。
77 lines (76 loc) • 3.01 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.runCheck = exports.sleep = void 0;
function checkByElement(page, selector) {
return __awaiter(this, void 0, void 0, function* () {
return !!(yield page.$(selector));
});
}
// 计时结束后的标志
const sleepStr = "awake";
const sleep = (s) => {
return new Promise((res) => {
setTimeout(() => {
res(sleepStr);
}, s);
});
};
exports.sleep = sleep;
/**
*
* @param check 检查方法,可以返回 promise 或者 boolean
* @param timeout 检查超时时间,默认 10 秒钟,
* @returns
*/
function runCheck(check, timeout = 10 * 1000) {
return __awaiter(this, void 0, void 0, function* () {
let _resolve;
let _reject;
const maxTime = +new Date() + timeout;
const returnPromise = new Promise((resolve, reject) => {
_resolve = resolve;
_reject = reject;
});
(function runrun() {
return __awaiter(this, void 0, void 0, function* () {
// 剩余时间
const delta = maxTime - +new Date();
if (delta < 0) {
_reject("检查失败[超时]");
}
let checkResult = false;
try {
// 每次执行 check,都与剩余时间进行比较,避免超时
checkResult = yield Promise.race([check(), (0, exports.sleep)(delta)]);
}
catch (error) {
_reject("检查失败[check方法执行出错]");
}
if (checkResult === sleepStr) {
// sleep 函数先结束,表示已经超时了
_reject("检查失败[超时]");
}
else if (checkResult) {
_resolve();
}
else if (!checkResult) {
// check 执行返回 false,表示还没得到正确的结果,继续执行 check
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
runrun();
}), 100);
}
});
})();
return returnPromise;
});
}
exports.runCheck = runCheck;