一、TypeScript-爬虫-扩展-单例改造
需求:改造NewAnalyzer将其变成单例模式
-
代码示例:
// 重点代码 // 私有化构造方法 private constructor() {} // 私有化单例属性 private static instance: NewAnalyzer; // 提供静态的获取实例方法 static getInstance(): NewAnalyzer { if (!NewAnalyzer.instance) { NewAnalyzer.instance = new NewAnalyzer(); } return NewAnalyzer.instance; }
-
完整代码:
import fs from "fs"; import cheerio from "cheerio"; import { Analyzer } from "./crowller"; interface Content { [propName: number]: string[]; } export default class NewAnalyzer implements Analyzer { // 私有化构造方法 private constructor() {} // 私有化单例属性 private static instance: NewAnalyzer; // 提供静态的获取实例方法 static getInstance(): NewAnalyzer { if (!NewAnalyzer.instance) { NewAnalyzer.instance = new NewAnalyzer(); } return NewAnalyzer.instance; } /** * 处理html中的数据 * @param html */ private getJsonInfo(html: string): string[] { const contents: string[] = []; const $ = cheerio.load(html); const lines = $(".z-head-news_item"); lines.map((index, element) => { const childs = $(element).find("a"); const content = childs.text(); contents.push(content); }); return contents; } /** * 读物文件内容 * @param data */ private generateJsonContent(data: string[], filePath: string) { let fileContent: Content = {}; if (fs.existsSync(filePath)) { fileContent = JSON.parse(fs.readFileSync(filePath, "utf-8")); } let time = new Date().getTime(); fileContent[time] = data; return fileContent; } public analyze(html: string, filePath: string): string { const jsonInfo = this.getJsonInfo(html); const content = this.generateJsonContent(jsonInfo, filePath); return JSON.stringify(content); } }