从承诺结果返回字符串

时间:2018-09-13 10:28:35

标签: angularjs angular-promise angular-translate

我想为该$translate服务提供一个包装函数:https://angular-translate.github.io/docs/#/guide/03_using-translate-service,以便我们可以通过调用$ language.translate('keyword')而不是promise来在代码中轻松使用这些函数。

因此,我在我的应用程序中创建了一项新服务,该服务可以完成这项工作。这是一个非常简单的函数,但它返回的是undefined[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]或未定义(当我删除第一个return$translate(keyword)之前。 当我使用{{:: "KEYWORD" | translate}}之类的过滤器时,效果很好。

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

1 个答案:

答案 0 :(得分:1)

似乎您期望结果以同步方式进行,如果您使用的是异步变体,无论如何它将返回Promise对象。

似乎您可以使用synchronous使用$translate服务的$translate.instant()变体,但是这个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
    }
}]);