0

在下一个示例中,我无法访问函数“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);
    });
}

在下一个示例中,“local”s 是可访问的。我只是从请求的模块中复制了函数声明,并将它们直接粘贴到“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 的基础知识

谢谢。

4

3 回答 3

3

在第一个示例中,回调位于另一个范围内,因此无法访问locals.

您可以创建将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) { ... }
于 2013-06-07T14:42:12.460 回答
2

您可以像这样定义 3 个提到的函数:

function fetcher(locals) {
  return function _fetcher(callback) {
    // this function body will have access to locals
  }
}

并将您的代码重写为:

function task() {
    var locals = []    //<-- declared here
    async.series([
        fetcher(locals),    //<--  can now access "locals"
        parser(locals),     //<--  can now access "locals"
        saveToDb(locals)    //<--  can now access "locals"
    ],
            function (err) {
                if (err) return callback(err);
                callback(null);
    });
}
于 2013-06-07T14:40:23.617 回答
0

如果我正确理解您的问题,这是一个 javascript 101 问题。

fetcher 可以是创建具体 fetcher 的工厂。

var fetcher = function(locals){
 locals=locals||[] // optional , assign a default , whatever ...
 return function(){
   //do some operation with locals.
   doSomething(locals);
 }
}

然后在你的脚本中

 async.series([
        fetcher(locals),    //<--  will return the callback to use
        parser(locals),     //<--  will return the callback to use
        saveToDb(locals)    //<--  will return the callback to use
    ],

我相信这是一种柯里化。

于 2013-06-07T14:41:20.783 回答