Angularjs 从承诺结果返回字符串

Angularjs 从承诺结果返回字符串,angularjs,angular-promise,angular-translate,Angularjs,Angular Promise,Angular Translate,我希望在这个$translate服务周围有一个包装函数:这样我们就可以通过调用$language.translate('keyword')而不是promise在代码中轻松地使用这些函数 因此,我在我的应用程序中创建了一个新的服务,它应该可以完成这项工作。这是一个非常简单的函数,但它返回未定义的或[Object Object] angularApp.factory("$language", ['$translate', function($translate){ function tr

我希望在这个
$translate
服务周围有一个包装函数:这样我们就可以通过调用$language.translate('keyword')而不是promise在代码中轻松地使用这些函数

因此,我在我的应用程序中创建了一个新的服务,它应该可以完成这项工作。这是一个非常简单的函数,但它返回
未定义的
[Object Object]

 angularApp.factory("$language", ['$translate', function($translate){

    function trans(keyword){
        console.log("translate in $language", keyword);

        return $translate(keyword).then(function(msg) {
            console.log("translation successfull", msg);
            return msg;
        }, function(translationId){
            console.log("translation is not known", translationId);
            return translationId
        })
    }

    return {
        translate : trans
    }
}]);
在这两种情况下,当知道或不知道翻译时,
console.log()
会显示正确的字符串,但在我的页面上它会显示[object object]或undefined(当我删除第一个
返回
之前的
$translate(关键字)
)。 当我使用像
{::“KEYWORD”| translate}}
这样的过滤器时,效果很好


如何让我的函数返回带有translation或translationId的字符串(在没有找到translation时,它实际上与关键字相同)?

看起来您希望结果是同步的,如果您使用的是async variant,无论如何它将返回
Promise
对象

您似乎可以使用
$translate.instant()
使用
$translate
服务的
synchronous
变体,但此
sync
变体的缺点是,如果在翻译过程之间发生任何情况,您将不会收到错误代码

重写

angularApp.factory("$language", ['$translate', '$sce', function($translate, $sce){

    function trans(keyword){
        console.log("translate in $language", keyword);

        var translation = $translate.instant(keyword)
        var msg = $sce.valueOf(translation);
        if (msg) {
            console.log("translation successfull", msg);
            return msg;
        }
        else {
            console.log("translation is not known");
            return "Error"
        }
    }

    return {
        translate : trans
    }
}]);

太好了!这就是我需要的!@NVO很高兴看到它有帮助,谢谢:)