异步编程&promise(一)
程序员文章站
2022-05-08 11:29:44
...
一、异步编程
首先函数是一等公民,可以作为函数参数或者函数返回值
1、首先举个函数工厂的例子,顾名思义,用来生产函数,这个例子是判断一个变量的类型
function isType(type){
return function(param){
return Object.prototype.toString().call(param)==`[object ${type}]`;
}
}
判断是否是字符串,数组
let isString = isType('String');
isString('aa'); //true
2、实现前两次调用函数不执行,第三次调用时调用时才执行函数
function after(times,fn){
var count=0;
if(++count==times){
fn();
}
}
3、nodeJs异步读取文件案例
//引入node的fs模块
let fs = require('fs');
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
}
})
这里有些知识点需理解:
回调函数的问题
无法捕获错误 try catch | 因为先执行下图中的(1)不会报错误,等回调函数执行后,catch已经执行结束了,不会在捕获错误了 |
无法用return | 因为是异步,在赋值的时候还没有值 |
回调地域(当嵌套请求多时) | 多次串行请求 |
如果读取一个文件,可以这样写,如果需要先读取1.txt,再读取2.txt,最后取到所有数据进行展示,需要写为:
//引入node的fs模块
let fs = require('fs');
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data)
var data1=data;
fs.readFile('./2.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
console.log(data1+data)
}
})
}
})
如何解决上述问题
(1)通过事件发布订阅来实现
(2)哨兵函数
var result={};
function done(key,value){
result[key] =value;
if(Object.keys().length == 2){
console.log(result)
}
}
fs.readFile('./1.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
done('data1',data)
}
})
fs.readFile('./2.txt','utf-8',function(err,data){
if(err){
console.log(err)
}else{
done('data2',data)
}
})
优化
二、generator函数,是一个生成器函数,会产生迭代函数。
生成器函数和普通的函数不一样,调用时函数不会立即执行,会返回一个生成器的迭代器,迭代器是一个对象,每调用一次next就可以返回一个值对象、
function *go(){
console.log("1");
let b = yield 'a';
console.log("2");
let c = yield 'b';
console.log("3");
return c
}
let b = yield 'a';
这一行代码用于实现输入和输出,本次的输出放在yield后面,下次的输入放在yield前面。