回调函数javascript
// 假若有两个函数f1和f2 后者等待前者的执行结果
// 若是f1是一个很耗时的任务,能够考虑改写f1,把f2写成f1的回调函数
function f2(c) {
console.log(c, 'hehe');
}
function f1(callback) {
setTimeout(function() {
// f1任务代码
console.log('f1执行完');
callback('f2开始执行', 'hehe');
}, 1000);
}
f1(f2);
复制代码
事件监听css
f1.on('done', f2);
复制代码
发布/订阅html
function Event() {
// 存储不一样的事件类型对应不一样的处理函数,保证后续emmit能够执行。
this.cache = {};
}
// 绑定事件
Event.prototype.on = function(type, handle) {
if(!this.cache[type]) {
this.cache[type] = [handle];
}else {
this.cache[type].push(handle);
}
}
// 事件触发
Event.prototype.emmit = function() {
var type = arguments[0],
arg = [].slice.call(arguments, 1);
for(var i = 0; i < this.cache[type].length; i++) {
this.cache[type][i].apply(this, arg);
if(this.cache[type][i].flag) {
this.cache[type].splice(i, 1);
if(this.cache[type][i].flag) {
this.cache[type].splice(i, 1);
}
}
}
}
// 解除某个事件类型
Event.prototype.empty = function(type) {
this.cache[type] = [];
}
// 解除某个事件
Event.prototype.remove = function(type, handle) {
this.cache[type] = this.cache[type].filter((ele) => ele != handle);
}
// 绑定一次事件
Event.prototype.once = function(type, handle) {
if(!this.cache[type]) {
this.cache[type] = [];
}
// 作标记
handle.flag = true;
this.cache[type].push(handle);
}
function detail1(time) {
console.log('overtime1' + time);
}
function detail2(time) {
console.log('overtime2' + time);
}
var oE = new Event();
oE.on('over', detail1);
oE.on('over', detail2);
oE.emmit('over', '2019-11-11');
oE.remove('over', detail2);
oE.emmit('over', 'second-11-11');
复制代码
Promise对象java
function MyPromise(executor) {
var self = this;
self.status = 'pending';
self.resolveValue = null;
self.rejectReason = null;
self.resolveCallBackList = [];
self.RejectCallBackList = [];
function resolve(value) {
if(self.status === 'pending') {
self.status = 'Fulfilled';
self.resolveValue = value;
self.resolveCallBackList.forEach(function(ele) {
ele();
});
}
}
function reject(reason) {
if(self.status === 'pending') {
self.status = 'Rejected';
self.rejectReason = reason;
self.RejectCallBackList.forEach(function(ele) {
ele();
})
}
}
try {
executor(resolve, reject);
}catch(e) {
reject(e);
}
}
function ResolutionReturnPromise(nextPromise, returnValue, res, rej) {
if(returnValue instanceof MyPromise) {
returnValue.then(function() {
res(val);
}, function(reason) {
rej(reason);
})
}else {
res(returnValue);
}
}
MyPromise.prototype.then = function(onFulfilled, onRejected) {
if(!onFulfilled) {
onFulfilled = function(val) {
return val;
}
}
if(!onRejected) {
onRejected = function(reason) {
throw new Error(reason);
}
}
var self = this;
var nextPromise = new MyPromise(function(res, rej) {
if(self.status === 'Fulfilled') {
setTimeout(function() {
try {
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionReturnPromise(nextPromise, nextResolveValue, res, rej);
}catch(e) {
rej(e);
}
}, 0);
}
if(self.status === 'Rejected') {
setTimeout(function() {
try{
var nextResolveValue = onRejected(self.rejectReason);
ResolutionReturnPromise(nextPromise, nextRejectValue, res, rej);
}catch(e) {
rej(e);
}
})
}
if(self.status === 'pending') {
self.resolveCallBackList.push(function() {
setTimeout(function() {
try {
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionReturnPromise(nextPromise, nextResolveValue, res, rej);
}catch(e) {
rej(e);
}
}, 0)
})
}
})
return nextPromise;
}
MyPromise.race = function(promiseArr) {
return new Promise(function(resolve, reject) {
promiseArr.forEach(function(promise, index) {
promise.then(resolve, reject);
})
})
}
复制代码
function AJAX(json) {
var url = json.url,
method = json.method,
flag = json.flag,
data = json.data,
callBack = json.callBack,
xhr = null;
// 1. 建立异步对象
if(window.XMLHttpRequest) {
// 通常主流浏览器支持这个
xhr = new window.XMLHttpRequest();
}else {
// IE6如下用这个
xhr = new ActiveXObject('Microsoft.XMLHTTP');
}
// 2. 让异步对象监听接收服务器的响应数据
xhr.onreadystatechange = function() {
if(xhr.readyState === 4 && xhr.status === 200) {
// 数据已经可用了
callBack(xhr.responseText);
}
}
// 创建对服务器的调用
if(method === 'get') {
url += '?' + data + new Data().getTime();
// 3. 设置请求方式
xhr.open('get', url, flag);
xhr.send();
}else {
xhr.open('post', url, flag);
// 4. 设置请求头
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
// 5. 设置请求体
xhr.send(data);
}
}
复制代码
// 这样能层层回调的事情,你会发现要写多个回调函数,一堆.then不够优雅,
// 有没有写法写起来像同步很优雅,最后也是经过异步的方式来搞定层层回调的结果。
function readFile(path) {
return new Promise((res, rej) => {
fs.readFile(path, 'utf-8', (err, data) => {
if(err) {
rej(err);
}else {
res(data);
}
})
})
};
readFile('https://api.github.com/users/superman66')
.then((val) => {
return readFile(val);
}, () => {}).then((val) => {
return readFile(val);
})
.then((val) => {
console.log(val);
});
// async写法
async function read(url) {
let val1 = await readFile(url);
let val2 = await readFile(val1);
let val3 = await readFile(val2);
}
read('https://api.github.com/users/superman66')
.then((val) => console.log(val));
复制代码
async function read(url) {
try {
let val1 = await readFile(url);
let val2 = await readFile(val1);
let val3 = await readFile(val2);
}catch(e) {
console.log(e);
}
}
readFile('./data/number.txt').then((val) => console.log(val));
复制代码
// 以前经过解决同步并发异步的结果是使用Promise.all()去解决的,首先Promise.all()使用的时候须要传递多个promise对象
// 其次他是所有成功才成功,一个失败所有失败
Promise.all([readFile('./data/number1.txt), readFile('./readFile/number2.txt'), readFile('./data/number3.txt')])
.then((val) => console.log(val), (reason) => console.log(reason));
复制代码
async function read1() {
let val1 = null;
try{
val1 = await readFile('./data/number1.txt');
console.log(val1);
}catch(e) {
console.log(e);
}
}
async function read2() {
let val2 = null;
try{
val2 = await readFile('./data/number2.txt');
console.log(val2);
}catch(e) {
console.log(e);
}
}
async function read3() {
let val3 = null;
try {
val3 = await readFile('./data/number3.txt');
console.log(val3);
}catch(e) {
console.log(e);
}
}
function readAll(...args) {
args.forEach((ele) => {
ele();
})
}
readAll(read1, read2, read3);
复制代码
funtion fn(a, b, ...args) {
// ...
}
复制代码
function fn(...[a, b, c]) {
console.log(a + b + c);
}
fn(1);
fn(1, 2, 3);
fn(1, 2, 3, 4);
复制代码
// 把不可迭代数据变成可迭代数据
let obj = {
0: 'a',
1: 'b',
2: 'c',
length: 3,
[Symbol.iterator]: function() {
let curIndex = 0;
let next = () => {
return {
value: this[curIndex],
done: this.length == ++ curIndex
}
}
return {
next
}
}
}
console.log([...obj])
for(let p of obj) {
console.log(p);
}
复制代码
function OuterInterator() {
let curIndex = 0;
let next = () => {
return {
value: o[curIndex],
done: o.length == ++ curIndex;
}
}
return {
next
}
}
let oIt = OuterIterator(arr);
复制代码
function loadScript(url, callback) {
var script = document.createElement('script'),
script.type = 'text/javaScript';
if(script.readyState) { // IE
if(script.onreadystatechange === 'complete' || script.onreadystatechange === 'loaded') {
callback();
}
}else { // FireFox丶Safari丶Chrome and Opera
script.onload = function() {
callback();
}
}
script.url = url;
document.head.appendChild(script);
}
复制代码
var myLink = document.createElement('link');
myLink.rel = 'stylesheet';
'myLink.href = './index.css';
documemt.head.insertBefore(myLink, document.head.childNodes[document.head.childNodes.length - 1].nextSibling);
复制代码
<link rel="style" href="css.style" media="jscourse" onload="this.media='all'">
复制代码
<link rel="preload" href="sccriptfile.js" as="script">
// 要用的时候 就建立一个script标签加载它,这个时候直接从缓存中拿到这个文件了,由于提早加载好了
var oScript = document.createElement('script');
script.src = 'index.js';
document.body.appendChild(script);
复制代码
参考连接:www.cnblogs.com/cjx-work/p/… juejin.im/post/596e14…node