Возврат строки из результата обещания

Я хочу иметь функцию-оболочку вокруг этой службы $translate: https://angular-translate.github.io/docs/#/guide/03_using-translate-service, поэтому мы можем легко использовать эти функции в нашем коде, вызывая $language.translate('keyword') вместо обещания .

Итак, я создаю новую службу в своем приложении, которая должна выполнять эту работу. Это очень простая функция, но она возвращает 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] или undefined (когда я удаляю первый return прямо перед $translate(keyword). Когда я использую фильтр типа {{:: "KEYWORD" | translate}}, он работает отлично.

Как я могу позволить моей функции возвращать строку с переводом или translationId (который на самом деле совпадает с ключевым словом, когда перевод не найден)?


person NVO    schedule 13.09.2018    source источник


Ответы (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
    }
}]);
person Pankaj Parkar    schedule 13.09.2018
comment
Идеальный! Это то, что мне было нужно! - person NVO; 13.09.2018
comment
@NVO Рад видеть, что это помогло, спасибо :) - person Pankaj Parkar; 13.09.2018