文档章节

使用nodeJs的原生Promise

未央
 未央
发布于 2015/09/10 18:02
字数 574
阅读 22
收藏 0

如果你需要在指定文件夹中找出最大的文件(不包含子文件夹),用nodeJs如何做呢?

除了直接用回调调回调的方法外,还有很多优雅的方法来做这样的事情:

主程序的代码如下,简洁大方有内涵:


var findLargest = require('./findLargest');
findLargest('E:\\fakepath').then(function(filename){
	console.log('largest file was: ', filename);
}).catch(console.err);



好了,“驾驶方法培训结束,接下来只剩下造车了!”



Async版

关于Async大家可以看看这些链接的介绍


http://blog.fens.me/nodejs-async/


在网上流传着这么一段代码:


var fs = require('fs')
var async = require('async')
var path = require('path')


module.exports = function (dir, cb) {
  async.waterfall([
    function (next) {
      fs.readdir(dir, next)
    },
    function (files, next) {
      var paths = 
       files.map(function (file) { return path.join(dir,file) })
      async.map(paths, fs.stat, function (er, stats) {
        next(er, files, stats)
      })
    },
    function (files, stats, next) {
      var largest = stats
        .filter(function (stat) { return stat.isFile() })
        .reduce(function (prev, next) {
        if (prev.size > next.size) return prev
          return next
        })
        next(null, files[stats.indexOf(largest)])
    }
  ], cb)
}



Async总能写出很漂亮的瀑布一般的代码,但!这不是我们今天的讨论的主题!



Promise

关于Promise的介绍,可以参考


http://www.tuicool.com/articles/AjaUjyJ
于是乎,有了这样的代码



var fs = require('fs');
var path = require('path');
var Q = require('q');

var fs_readdir = Q.denodeify(fs.readdir)
var fs_stat = Q.denodeify(fs.stat)

module.exports = function (dir){
  //使用Q来模拟promise
  return fs_readdir(dir)
    .then(function(files){
      var promises = files.map(function(file){
        return fs_stat(path.join(dir, file));
      });
      return Q.all(promises).then(function(stats){
        return [files, stats];
      });
    })
    .then(function(data){
      var files = data[0];
      var stats = data[1];
      var largest = stats
          .filter(function(stat){return stat.isFile();})
          .reduce(function(prev, next){
            if(prev.size > next.size){
              return prev;
            }
           return next;
         });
       return files[stats.indexOf(largest)];
     });
}



这样就能够足够优雅地满足需求,但是!这依旧不是我想要的,我要使用原生Promise支持


ES6的Promise


var fs = require('fs');
var path = require('path');

module.exports = function (dir){
  return readDir(dir).then(getMaxStat);
}
//es6 promise
function readDir(dir){
	var readDirPromise = new Promise(function(resolve){
		fs.readdir(dir, function(err, files){
			if(err){
				throw err;
			}
			resolve({dir: dir, files: files});
		});
	});

	return readDirPromise;
}

function getMaxStat(param){
	var promises = param.files.map(function (file){
		var statPromise = new Promise(function(resolve){
			fs.stat(path.join(param.dir, file), function (err, stat){
				if(err){
					return console.error(err);
				}
				resolve(stat);
			});
		});
		return statPromise;
	});
	var maxStatPromise = new Promise(function(resolve){
		Promise.all(promises).then(function(stats){
			var maxStat = stats.reduce(function(prev, next){
				if(prev.size > next.size) return prev;
				return next;
			});
			resolve(param.files[stats.indexOf(maxStat)]);
		});
	});
	
	return maxStatPromise;
}

除了系统包外,不依赖其他包,而且也做到了相对优雅,代码不够漂亮,还有进一步优化的空间,望各路高手轻拍



© 著作权归作者所有

未央
粉丝 3
博文 1
码字总数 574
作品 0
西安
程序员
私信 提问
BeautyWe.js 一套专注于微信小程序的开发范式

一个简单的介绍 BeautyWe.js 是什么? 它是一套专注于微信小程序的企业级开发范式,它的愿景是: 让企业级的微信小程序项目中的代码,更加简单、漂亮。 为什么要这样命名呢? Write beautifu...

JerryC
06/10
0
0
V8 中更快的异步函数和 promises

原文作者:Maya Lekova and Benedikt Meurer 译者:UC 国际研发 Jothy 写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量...

2018/11/29
0
0
Node.js 根本没有这样搞性能优化的?

1、使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么? Node.js 每个版本的性能提升主要来自于...

前端小攻略
2018/12/26
0
0
你不知道的Node.js性能优化

你不知道的Node.js性能优化 const stringify = fastJson({ }) console.log(stringify({ }))//=> {"name":"Starkwang","age":23,"books":["C++ Primier","響け!ユーフォニアム~"]} callbac......

Starkwang
2018/11/16
0
0
Node 异步通信解决方案 - crosscom

crosscom crosscom是nodejs进程间及浏览器非同域页面间的Callback方式及Promise方式异步通信解决方案。 支持的环境 nodejs环境 浏览器requirejs环境 浏览器原生JavaScript环境 nodejs环境与浏...

开发者王晨旭
2017/12/24
215
0

没有更多内容

加载失败,请刷新页面

加载更多

高级技术题整理

1. 为什么等待和通知是在 Object 类而不是 Thread 中声明的? 一个棘手的 Java 问题,如果 Java编程语言不是你设计的,你怎么能回答这个问题呢。Java编程的常识和深入了解有助于回答这种棘手...

泉天下
8分钟前
1
0
Elasticsearch

1 、下载 下载地址:https://www.elastic.co/downloads/past-releases 2 、安装 elasticsearch无需安装,解压即用。 3.运行 进入elasticsearch/bin目录,可以看到下面的执行文件: 双击运行 ...

少年已不再年少
8分钟前
4
0
Spring Boot 2.X(七):Spring Cache 使用

Spring Cache 简介 在 Spring 3.1 中引入了多 Cache 的支持,在 spring-context 包中定义了org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 两个接口来统一不同......

朝雾轻寒
11分钟前
2
0
java路径问题

在Java中有几种常见获取文件路径的方法,此处演示下用法和效果。 测试项目目录结构如右图: 1、使用File类 File file = new File("");// Java项目中-->D:\WorkSoftware\Workspace\EclipseP...

随心の随缘
13分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部