js

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' }
上一篇下一篇

猜你喜欢

热点阅读