2015-09-18 3 views
0

Я работаю через learnyounode учебники и наткнулся на эту интересную немного, и я пытаюсь выяснить, как обрабатывать объем при использовании переменной в качестве функции обратного вызова:Callbacks и переменная сфера

Следующий код работает:

module.exports = function(filePath, fileExtention, callback){ 
    fs.readdir(filePath, function (err, list){ 
    if(err) return callback("Something went wrong", null) 
    var fileArray = [] 
    list.forEach(function(file){ 
     if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file) 
    }) 
    return callback(null, fileArray) 
    }) 
} 

Хотя этот код генерирует исключение fileExtention не определено:

module.exports = function(filePath, fileExtention, callback){ 
    fs.readdir(filePath, cb) 
} 

var cb = function (err, list){ 
    if(err) return callback("Something went wrong", null) 
    var fileArray = [] 
    list.forEach(function(file){ 
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file) 
    }) 
    return callback(null, fileArray) 
} 

Я пытаюсь понять, почему эту переменную выходит за рамки второй функции обратного вызова, которая определена как cb и что я сделал бы, чтобы исправить это, поскольку подпись этого обратного вызова исправлена.

Будет ли решение создавать локальную переменную, которая установлена ​​в параметр fileExtention?

Это работает, но я не знаю, если это правильный способ справиться с обратного вызова передается в модуль для поддержания сферы:

var fs = require('fs') 
var fe = "" 
var cb; 
module.exports = function(filePath, fileExtention, callback){ 
    fe = fileExtention 
    cb = callback; 
    fs.readdir(filePath, findFiles) 
} 

var findFiles = function (err, list){ 
    if(err) return cb("Something went wrong", null) 
    var fileArray = [] 
    list.forEach(function(file){ 
    if(file.indexOf('.' + fe) > -1) fileArray.push(file) 
    }) 
    return cb(null, fileArray) 
} 
+0

Вам необходимо передать обратный вызов в качестве параметра. – SLaks

+1

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures –

ответ

1

Эти две ссылки помогут вам лучше понять, как сфера применения и закрытие работы в Javascript:

Хороший способ сделать то, что вы хотите, - создать еще одну анонимную функцию, а затем отправить параметр для созданной вами функции. Нечто подобное:

module.exports = function(filePath, fileExtention, callback){ 
    fs.readdir(filePath, function(err, list) { 
    cb(err, list, fileExtension, callback); 
    }); 
} 

var cb = function (err, list, fileExtension, callback) { 
    if(err) return callback("Something went wrong", null) 
    var fileArray = [] 
    list.forEach(function(file){ 
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file) 
    }) 
    return callback(null, fileArray) 
} 
+0

Удивительные ссылки и хорошее понимание –

1

Я пытаюсь понять, почему эта переменная выходит из области видимости для второй функции обратного вызова, которая определена как Сь и то, что я хотел бы сделать, чтобы исправить это, как подпись, что обратный вызов исправлен.

Это вне сферы действия, потому что функция, которая пытается ее использовать, объявлена ​​вне функции, которая ее определила.

Будет ли решение создавать локальную переменную, которая задана параметром fileExtention?

Местная переменная ... где?

Внутри exports функция? Вот что такое fileExtention.

Внутри cb функция? Вы все равно должны получать стоимость откуда-то.


решение делать то, что вы делали в первую очередь, и положить создать функцию внутри функции exports.

В качестве альтернативы, вы можете сделать другой функции, которая содержит как cb и вызов к fs.readdir и затем вызвать эту функцию из exports проходящего всего значения, нужно оттуда в качестве аргументов.


Это работает, но я не знаю, если это правильный способ обработки обратного вызова передается в модуль для поддержания прицела

Как правило: Избегайте глобал. Эта конкретная конструкция выглядит так, что она может подвергаться условиям гонки.

0

Короткий ответ и как это исправить:

module.exports = function(filePath, fileExtention, callback){ 
    var fileExtention = fileExtention 
    fs.readdir(filePath, cb) 
} 

var cb = function (err, list){ 
    if(err) return callback("Something went wrong", null) 
    var fileArray = [] 
    list.forEach(function(file){ 
    if(file.indexOf('.' + fileExtention) > -1) fileArray.push(file) 
    }) 
    return callback(null, fileArray) 
} 

Является ли это лучше? Конечно нет!

Это работает? Я думаю так!

Смежные вопросы