Nodejs模块函数返回undefined,而不是异步

时间:2015-03-26 23:14:27

标签: javascript json node.js express

非常(非常)新的Node所以这可能是愚蠢的。我有一个模块,它定义了我迭代的各种路由来定义应用程序的路由。这很好用。

在设置路线时,我想在另一个模块checkAvailableTranslation中调用一个函数language来检查该页面的翻译是否以另一种语言存在(req.locale是用户喜欢的语言我们正在尝试找到匹配项,如果是,则返回一个URL片段。

{j}文件加载strings对象,其中包含一个项目translations,该项目是映射到URL片段的ISO国家/地区代码数组。

** app.js **

var routes = require("./config/routing.js")
routes.forEach(function(item) {
    item.routes.forEach(function(route) {
        app.get(route.path, function(req, res) {
            var strings = require(route.strings)
            translations = language.checkAvailableTranslation(req.locale, strings.translations))
            console.log(translations) // undefined?!?!?!?!
            res.render(route.render, {
                layout: route.layout,
                strings: strings
            })
        })
    })
})

** strings.translations **

[
    { "fr": "/fr" },
    { "ar": "/ar" },
    { "es": "/es" },
    { "pt": "/pt" },
    { "de": "/de" }
]

** language.js **

module.exports = function() {
    var module = {}

    module.checkAvailableTranslation = function(language, translations) {
        translations.forEach(function(el) {
            if( el[language] ) {
                console.log(el[language]) // this logs a matched language
                return el[language] // this disappears into the ether
            }
        })
    }
    return module
}

因此,translations.forEach成功迭代并找到匹配项时,所有内容通常都会按预期运行。但是它似乎没有将值返回给app.js - 当我输出函数的返回时,我得到undefined

是否从json文件加载strings这一事实使得这是一个异步调用,就好像它是一个数据库一样?如果是这样(那需要解释),我应该在这里做些什么来建立一个承诺来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您从forEach回调中返回,这是不可能的。 您需要在数组上手动迭代或将结果写入checkAvailableTranslation方法范围内的变量(但仍然遍历translations中的所有项。)

手册" forEach"

module.checkAvailableTranslation = function(language, translations) {
    for (
        var i = 0, translation = translations[i][language];
        i < translations.length;
        i++, translation = translations[i][language]
    ) {
        if (translation)
            return translation;
    }
}

或使用Array.prototype.some

function (language, translations) {
    var res;
    translations.some(function (translation) {
        return !!(res = translation[language]);
    });
    return res;
}

编辑: Ninja方法

function n(l,t,i){return t[i|0][l]||g(l,t,(i|0)+1)}