【发布时间】:2016-06-15 11:24:59
【问题描述】:
编辑
感谢回答,我有一个工作版本。问题结束时的代码;感谢@estus 和@Jared 的帮助。
原始问题
进入 Node 并尝试处理并发。从一个简单的例子开始:给定两个文件的名称,确定哪个更大。常规(顺序)解决方案:
var fs = require('fs');
var fname1=process.argv[2]
var fname2=process.argv[3]
var stats1 = fs.statSync(fname1)
size1=stats1["size"]
var stats2 = fs.statSync(fname2)
size2=stats2["size"]
if(size1 > size2) {
console.log(fname1 + " is bigger")
} else if (size2 > size1) {
console.log(fname2 + " is bigger")
} else {
console.log("The files are the same size")
}
现在假设我想并行统计文件*。我可以将代码转换为使用 async stat 函数:
var fs = require('fs');
var fname1=process.argv[2]
var fname2=process.argv[3]
fs.stat(fname1, function doneReading(err, stats) {
size1=stats["size"]
fs.stat(fname2, function doneReading(err, stats) {
size2=stats["size"]
if(size1 > size2) {
console.log(fname1 + " is bigger")
} else if (size2 > size1) {
console.log(fname2 + " is bigger")
} else {
console.log("The files are the same size")
}
})
})
但是:
- 可读性较差;
- 如果我想比较 >2 个文件,它不会很好地扩展;
- 不确定它是否会并行统计文件(我不清楚 atm 后台线程是如何工作的)。
那么,具体来说,惯用的方式是:
- 同时产生多个动作,然后
- 全部完成后使用它们的组合结果?
也许 promises 可能是一个候选者? Promise.all 看起来像是等待所有承诺的方式,但不清楚如何实际使用它们的结果。
谢谢。
解决方案
'use strict';
const co = require('co');
const fs = require('fs-promise');
var fname1=process.argv[2]
var fname2=process.argv[3]
co(function* () {
let res = yield [fs.stat(fname1), fs.stat(fname2)];
let size1 = res[0]["size"]
let size2 = res[1]["size"]
if(size1 > size2) {
console.log(fname1 + " is bigger")
} else if (size2 > size1) {
console.log(fname2 + " is bigger")
} else {
console.log("The files are the same size")
}
})
它非常易读、简洁,并且完全没有令人讨厌的回调。并且很容易扩展到比较 n 个文件。
--
*是的,我知道在这种情况下没有必要这样做;目的是通过一个简单的例子来理解模式。
【问题讨论】:
标签: javascript node.js ecmascript-6 es6-promise