使用q promise和map来获取文件内容
Using q promises with map to get file contents
我正在尝试使用q
promise库来获取目录中.json
文件的名称并返回这些文件的内容。我可以获得文件名,但在将arr.map
与promise结合使用以读取文件的内容时遇到了问题。我希望getContents()
返回一个包含指定文件名内容的映射数组。
function readDir() {
var deferred = q.defer();
fs.readdir('users', function(err, data) {
if (err) console.log(err);
deferred.resolve(data);
})
return deferred.promise;
}
function getContents(filenames) {
return filenames.map(function(filename) {
fs.readFile('users/' + filename, 'utf8', function(err, result) {
return result;
});
});
}
readDir()
.then(getContents)
.then(function(fileContents) {
// currently returns undefined
console.log(fileContents);
});
如何在promise中正确地包装getConents()
,使数组的内容不等于undefined?
首先,您需要获得一个promise数组,即return result
在异步回调中是无用的。为每一个readFile
呼叫做出承诺:
filenames.map(function(filename) {
return Q.nfcall(fs.readFile, 'users/' + filename, 'utf8');
// ^^^^^^ here's where the return is needed
})
Q.nfcall
函数基本上执行与您在readDir
函数中编写的内容相同的内容。
现在您已经有了一个promise数组,您可以使用Q.all
:轻松地将其转换为一个数组的promise(等待所有的promise)
function getContents(filenames) {
return Q.all(filenames.map(function(filename) {
return Q.nfcall(fs.readFile, 'users/' + filename, 'utf8');
}));
}
首先,您可以使用promise定义fs.readFile
的适当异步版本:
function readFileAsync(/* ...args */) {
return Q.nfapply(fs.readFile, arguments);
}
之后,你有两个选择。这将并行读取文件:
function getContents(filenames) {
return Q.all(
filenames.map(function(filename) {
return readFileAsync('users/' + filename, 'utf8');
})
);
}
这将逐一阅读:
function qMap(array, selector) {
var i = 0;
var result = [];
function store(x) {
result.push(x);
return next();
}
function next() {
if (i < array.length) {
var index = i++;
var item = array[index];
return Q.fcall(selector, item, index).then(store);
} else {
return result;
}
}
return Q.fcall(next);
}
function getContents(filenames) {
return qMap(filenames, function(filename) {
return readFileAsync('users/' + filename, 'utf-8');
});
}
相关文章:
- Fin上传器直接上传到Azure Blob存储-在Javascript中获取文件uri
- Node js:如何获取文件签名标头而不是 mime 类型
- 如何在没有JQuery的情况下在Javascript中获取文件的内容
- 获取文件并从rest api下载
- 使用javascript获取文件输入
- JS获取文件内容
- 如何在使用javascript上传文件时获取文件源路径
- javascript如何从服务器获取文件夹中文件的url
- 如何使用javascript获取文件夹中的图像列表
- 应用程序脚本-自动从谷歌驱动器删除超过3天的文件-获取文件列表
- 如何在javascript中从ondrop事件中获取文件URL
- 如何使用javascript获取文件夹中的文件列表
- Javascript获取文件内容循环
- 通过Crypto.js获取文件的md5sum
- Cordova应用程序:如何获取文件的实际路径
- 如何使用PHP从我自己的网站上的Google Drive获取文件和文件夹列表
- 如何在所有父节点上获取文件夹图标,在所有子节点上获取文件夹加图标(左侧的图标)
- 我想要获取文件输入并将其保存到本地路径的Javascript
- 从Google Drive获取文件并隐藏到Blob
- drupal7获取文件路径