after函数的应用(多个异步请求结束时触发,Promise.a
2019-06-10 本文已影响0人
CRUD_科科
lodash中after的实现
function after(times,callback) {
if (typeof callback != 'function') {
throw new TypeError('Expected a function')
}
return function() {
if (--times === 0) {
callback()
}
}
}
function say() {
console.log('你好')
}
let newSay = after(3,say); //newSay函数执行三次以后,执行say函数
newSay();
newSay();
newSay(); // '你好'
获取多个异步请求结果中after的应用
我们有一个新需求,同时读取两个文件的内容,并且等两个文件内容读取完毕,打印出两个文件的内容:
// 获取多个异步请求结果
const fs = require('fs');
function after(times, callback) {
let data = {};
return function(key, value) {
data[key] = value;
if(times === Object.keys(data).length) {
callback(data)
}
}
}
function render(data) {
console.log(data) // { name: '羊羊羊', age: '27' }
}
let newRender = after(2, render)
fs.readFile('./name.txt', 'utf8', function (err, name) { // 读取文件内容 异步
if(!err) {
newRender('name', name)
}
})
fs.readFile('./age.txt', 'utf8', function(err, age) { // 读取文件内容 异步
if (!err) {
newRender('age', age)
}
})
类似Promise.all的功能
let newRender = after(3, render);
var promise1 = Promise.resolve(3);
var promise2 = 42;
var promise3 = new Promise(function (resolve, reject) {
setTimeout(resolve, 100, 'foo');
});
Promise.all([promise1, promise2, promise3]).then(function(values){
console.log(values) // Array [3, 42, "foo"]
})
promise1.then(function(data) {
newRender('1', data)
})
newRender('2', promise2)
promise3.then(function (data) {
newRender('3', data)
})
// newRender结果{ '1': 3, '2': 42, '3': 'foo' }