Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用q promises和map获取文件内容_Javascript_Node.js_Promise_Q - Fatal编程技术网

Javascript 使用q promises和map获取文件内容

Javascript 使用q promises和map获取文件内容,javascript,node.js,promise,q,Javascript,Node.js,Promise,Q,我试图使用qpromise库获取目录中.json文件的名称并返回这些文件的内容。我能够获取文件名,但在使用arr.map与Promissions结合使用时遇到问题,无法读取文件内容。我希望getContents()返回包含指定文件名内容的映射数组 function readDir() { var deferred = q.defer(); fs.readdir('users', function(err, data) { if (err) console.log(

我试图使用
q
promise库获取目录中
.json
文件的名称并返回这些文件的内容。我能够获取文件名,但在使用
arr.map
与Promissions结合使用时遇到问题,无法读取文件内容。我希望
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);
    });

如何正确地将
getConents()
包装在承诺中,使数组的内容不等于未定义的内容?

首先,您需要获得承诺数组-该
返回结果在异步回调中无效。为每一次
readFile
通话做出承诺:

filenames.map(function(filename) {
    return Q.nfcall(fs.readFile, 'users/' + filename, 'utf8');
//  ^^^^^^ here's where the return is needed
})
基本上,它的功能与您在
readDir
函数中编写的功能相同

现在您已经有了一系列承诺,您可以使用以下方法轻松地将其转化为一系列承诺(等待所有承诺):


首先,您可以使用以下命令定义
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');
    });
}
函数qMap(数组、选择器){
var i=0;
var结果=[];
功能存储(x){
结果:推(x);
返回next();
}
函数next(){
if(i
是否有一种简单的方法可以在仍然使用
Q.nfcall()
的情况下对结果使用
JSON.parse()
?只需执行
Q.nfcall(…)。然后(JSON.parse)
(就像对JSON文本的其他承诺一样)
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');
    });
}