非常(非常)新的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
这一事实使得这是一个异步调用,就好像它是一个数据库一样?如果是这样(那需要解释),我应该在这里做些什么来建立一个承诺来解决这个问题?
答案 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;
}
}
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)}