2012-07-07 29 views
7

tôi cần phải xem một số lượng nhỏ các thư mục trong một ứng dụng Node.js:đèo tham số bổ sung cho chức năng gọi lại javascript

function updated(event, filename){ 
    log("CHANGED\t/share/channels/" + filename); 
} 
for(i in channels) 
    fs.watch('share/channels/' + channels[i], {persistent: false}, updated); 

Vấn đề là fs.watch rằng chỉ có vượt qua tên tập tin với chức năng gọi lại, mà không bao gồm cả thư mục của nó. Có cách nào tôi bằng cách nào đó có thể truyền vào một tham số bổ sung cho hàm update() để nó biết vị trí của tệp không?

Tôi nghĩ rằng tôi đang tìm kiếm một cái gì đó tương tự như của Python functools.partial, nếu điều đó giúp bất kỳ.

Trả lời

4

Bạn có thể sử dụng Function.bind:

function updated(extraInformation, event, filename) { 
    log("CHANGED\t/share/channels/" + extraInformation + filename); 
} 

for(i in channels) 
    fs.watch('share/channels/' + channels[i], {persistent: false}, 
       updated.bind(null, 'wherever/it/is/')); 
+0

Tôi không noi theo tấm gương của bạn cả. Bạn thậm chí có tham chiếu rõ ràng tham số bổ sung mà bạn đã thêm vào hàm không? – ThorSummoner

+0

@ThorSummoner: 'update.bind (null, 'anywhere/it/is /')' trả về một hàm có thể lấy hai đối số, thêm ''anywhere/it/is /', và sau đó chuyển nó tới 'updated' (với 'null' là giá trị không sử dụng cho' this'). – Ryan

+0

Câu trả lời này là thiên đường được gửi đi. – Proximo

9

Bạn có thể vượt qua một chức năng khác nhau cho mỗi lần lặp:

var getUpdatedFunction = function(folderName) { 
    return function(event, filename) { 
     log("CHANGED\t" + folderName + "/" + filename); 
    }; 
}; 

for(i in channels) { 
    foldername = 'share/channels/' + channels[i]; 
    fs.watch(foldername, {persistent: false}, getUpdatedFunction(foldername)); 
} 
5

Ví dụ sử dụng JS Bind

Đốc: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Mẹo, các tham số ràng buộc xảy ra trước tham số thời gian gọi eters.

my_hello = 'Hello!' 
my_world = { 
    'antartica': 'cold', 
} 

anonymous_callback = function (injected1, injected2, param1, param2) { 
    param1 = param1 ? param1 : 'One'; 
    param2 = param2 ? param2 : 'Two'; 

    console.log('param1: (' + typeof(param1) + ') ' + param1) 
    console.log('param2: (' + typeof(param2) + ') ' + param2) 

    console.log('injected1: (' + typeof(injected1) + ') ' + injected1) 
    console.log('injected2: (' + typeof(injected2) + ') ' + injected2) 
    console.log(injected2) 
}.bind(this, my_hello, my_world) 

anonymous_callback('Param 1', 'Param 2') 

Output:

param1: (string) Param 1 
param2: (string) Param 2 
injected1: (string) Hello! 
injected2: (object) [object Object] 
{ antartica: 'cold' } 
+0

Cảm ơn bạn, tôi đã chiến đấu với vấn đề này hàng giờ và lời giải thích của bạn rõ ràng đến nỗi cuối cùng tôi cũng có thể làm cho nó hoạt động. – bitfidget

0

Bạn có thể vượt qua thêm callback tại chỗ

function updated(channel, filename) { 
    log('CHANGED\t ' + channel + '/' + filename); 
} 

for(i in channels) { 
    channel = '/share/channels/' + channels[i]; 
    fs.watch(channel, {persistent: false}, function (extra, event, filename) { 
    updated(channel, filename); 
    }); 
} 
Các vấn đề liên quan