在下一个示例中,我无权访问函数“fetcher”、“parser”和“saveToDb”内的变量“locals”。
var parser = require('parser.js');
var fetcher = require('fetcher.js');
var saveToDb = require('models/model.js');
var async = require('async');
function task() {
var locals = [] //<-- declared here
async.series([
fetcher, //<-- can not access "locals"
parser, //<-- can not access "locals"
saveToDb //<-- can not access "locals"
],
function (err) {
if (err) return callback(err);
callback(null);
});
}
在下一个示例中“本地”是可访问的。我只是从请求的模块中复制了函数声明,并将它们直接粘贴到“async.series”中。
var async = require('async');
function task() {
var locals = [] //<-- declared here
async.series([
function(callback) {// <-- can access "locals"},
function(callback) {// <-- can access "locals"},
function(callback) {// <-- can access "locals"}
],
function (err) {
if (err) return callback(err);
callback(null);
});
}
虽然这有效 - 我确实想保持我的代码模块化。 我该如何解决这个问题? 或者 - 我在这里忘记了 JavaScript 的基础知识?
谢谢。
最佳答案
在第一个示例中,回调位于另一个作用域中,因此无法访问本地
。
您可以创建部分函数来获取作为第一个参数传递的 locals
变量,但这需要您重写回调。
// creating a partial
async.series([
fetcher.bind(fetcher, locals),
parser.bind(parser, locals),
saveToDb.bind(saveToDb, locals)
], ...)
// new function signatures
function fetcher (locals, callback) { ... }
function parser (locals, callback) { ... }
function saveToDb(locals, callback) { ... }
关于Nodejs/async 中的 JavaScript 变量提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986660/