Nodejs/async 中的 JavaScript 变量提升

标签 javascript node.js scope async.js

在下一个示例中,我无权访问函数“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/

相关文章:

javascript - 如何检测网页是否在使用 Javascript 初始加载后重新加载?

javascript - 尽管 document.cookie 包含该值,但 $cookies.get() 给出未定义

javascript - 在 leaflet LayerGroup 中的单个标记上触发事件

node.js - 将 Node/Express 应用程序设置为实时或生产模式的最佳方法

java - 用 c 编写一个函数,其中包含以下语句序列 [不会编译]

javascript - 如何在 JavaScript 中加密一些在客户端不可见的字符串?

Node.js 和 Require.js 包含整个目录

node.js - 更新html文件时是否需要重启node.js的http-server

javascript - 如何在更新数据库记录时使用 $watch 查看更改

ios - 变量不在作用域内,即使它出现在 Swift 中同一作用域的其他地方