异步 & 回调 & 观察者模式

本文深入探讨了异步编程的概念及其在前后端开发中的应用,包括AJAX、setTimeout、Promise、async/await等技术。同时,介绍了如何使用Node.js进行网络请求,包括request模块的使用、爬虫技术及网页内容分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考教程

runoob菜鸟教程

异步

前端(浏览器端)

前端异步只有一下几种情况是异步

ajax xmlhttprequest
setInterval/setTimeout
jsonp

后端(服务器端node)

比前端多很多,很多方法都是异步的

fs.readFile //异步
fs.readFileSync //同步

异步一般配合回调函数,回调函数能让异步变得有意义

同步比异步少了回调函数

同步阻塞,相对稳定,不需要回调

异步非阻塞,相对不稳定,配合回调才有意义

//同步
var data = fs.readFileSync('./test.txt');
console.log(data.toString());

//异步
fs.readFile('./test.txt',function(err,data2){
	console.log(data2.toString());
});

回调嵌套

如果出现多个回调嵌套的时候,建议是用promise来去解决这个回调地狱

function buyPizza() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("买披萨");
			resolve()
		}, 1000);
	})
}
function buyDrink() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("买饮料");
			resolve()
		}, 1000);
	})
}
function eatMeal() {
	return new Promise((resolve, reject) => {
		setTimeout(() => {
			console.log("吃东西");
			//resolve()
		}, 1000);
	})
}
buyPizza().then(buyDrink).then(eatMeal);

await和async

await和async也是解决异步嵌套的一个方法,它建立在promise的基础上
promise&&await&&deferred和event loop

event和观察者模式

myEmitter.on('buypiza', () => {
    setTimeout(() => {
        console.log('买披萨');
        myEmitter.emit('eatpiza');
    }, 1000)
});

myEmitter.on('eatpiza', () => {
    setTimeout(() => {
        console.log('吃披萨');
        myEmitter.emit('meeting');
    }, 2000)
});

myEmitter.on('meeting', () => {
    console.log('约会');
});
myEmitter.emit('buypiza');

node-wifi

var wifi = require('node-wifi');

request

以前我们是自己写前端页面触发ajax请求来获取后端信息,但是有了request模块,我们可以伪造这个ajax请求

任何前端请求都有

请求头(浏览器信息),请求体(POST请求,请求参数会放在这个地方) 用户不可见的

响应头(服务器信息),响应体(页面的内容,用户可见)

爬虫

爬取网站的内容,然后可以保存到本地,或者分析页面获取有价值的信息

var request = require('request');
var fs = require('fs');
request('http://www.umei.cc/', function(error, response, body) {
	//console.log('error:', error); // Print the error if one occurred
	//console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
	console.log('body:', body); // Print the HTML for the Google homepage.
//	fs.writeFile('test.html', body, function(err) {
//		console.log("成功保存")
//	})
});
console.log("开始请求");

cheerio

实现网页内容分析,用法类似于jQuery,node版本jQuery,可以用它爬取文字,图片,音频

var request = require('request');
var cheerio = require('cheerio');
request('http://www.umei.cc/', function(error, response, body) {
	//console.log('body:', body); // Print the HTML for the Google homepage.
	const $ = cheerio.load(body);
	$("img").each((i,e)=>{
		console.log($(e).attr("src"))
	})
});

console.log("开始请求");

并非所有网站都是能爬,有些网站是防爬虫,还有一些网页是前端JS动态生成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值