2016-08-13 46 views
1

在寫this SO question一個例子的過程中,這個問題就來了:爲什麼Ramda在本地Array.map或Lodash沒有的例子中工作?

爲什麼本地Array.map拋出一個錯誤,這樣使用時:

[tmp1, tmp2].map(fs.createReadStream) 
    .forEach(stream => stream.pipe(jsonStream)); 


fs.js:1664 
    throw new TypeError('"options" argument must be a string or an object'); 
    ^

TypeError: "options" argument must be a string or an object 
    at new ReadStream (fs.js:1664:11) 
    at fs.createReadStream (fs.js:1649:10) 
    at Array.map (native) 
與lodash

同樣...但它工作正常ramda。

// Same error: 
_.map([tmp1, tmp2], fs.createReadStream) 
    .forEach(stream => stream.pipe(jsonStream)); 

// Works fine: 
R.map(fs.createReadStream, [tmp1, tmp2]) 
    .forEach(stream => stream.pipe(jsonStream)); 

注意,這是從引用問題全碼:

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

var tmp1 = path.join(__dirname, 'data', 'tmp1.json'); 
var tmp2 = path.join(__dirname, 'data', 'tmp2.json'); 

var jsonStream = JSONStream.parse(); 
jsonStream.on('data', function (data) { 
    console.log('---\nFrom which file does this data come from?'); 
    console.log(data); 
}); 

[tmp1, tmp2].map(p => { 
    return fs.createReadStream(p); 
}).forEach(stream => { 
    stream.pipe(jsonStream); 
}); 

fs.createReadStream第二個參數應該是undefined沒有?

回答

3

這很可能是由於Array.prototype.map_.map將三個參數傳遞給提供的映射函數(值,索引和集合),而R.map僅傳遞該值。

在您的示例中,fs.createReadStream正在被賦予數組索引作爲其第二個參數,因爲它期望使用選項對象或字符串,導致"options" argument must be a string or an object錯誤。如果你想以這種方式來使用Array.prototype.map_.map,你需要來包裝方法調用的功能,以防止額外的參數:

[tmp1, tmp2].map(p => fs.createReadStream(p)) 
+0

謝謝!知道額外的參數,但沒有做1 + 1 :) – justin

相關問題