链接角度转换的承诺

时间:2016-01-26 09:55:29

标签: angularjs angular-translate

作为Angular的新手,我正在努力使用特殊的承诺设置来处理angular-translate。

我有一个正常工作的CustomLoader for angular-translate,工作正常。但我必须调用CustomLoader两次(使用$ translate.refresh())并根据外部条件,CustomLoader应加载固定的数据预设或相同的预设,但与外部后端调用的结果合并。 / p>

这是我到目前为止所得到的:

(function () {
  'use strict';

/**
 * TranslationCustomLoader
 */
angular
   .module('myApp')
   .factory('TranslationCustomLoader', TranslationCustomLoader);

function TranslationCustomLoader($q, ENV, $http, ExternalService) {

return function (options) {

  var translations_en = {
    MYKEY1: 'Value1',
    MYKEY2: 'Value2',
    MYKEY3: 'Value3'
  };

  var translations_de = {
    MYKEY1: 'Wert1',
    MYKEY2: 'Wert2',
    MYKEY3: 'Wert3'
  };

  var deferred = $q.defer(), translations;

// Standard Dataset for Translations based on options.key (= language key)

  if (options.key === 'en') {
    translations = translations_en;
  } else {
    translations = translations_de;
  }

 // If some condition is met call external backend and retrieve additional data

  if (ExternalService.isCondition()) {
    $http({
      method: 'GET',
      params: {
        lang: options.key
      },
      url: ENV.apiEndpoint + 'api/v1/translations'
    }).success(function (data) {

 // Now replace/add data in variable 'translations' by external result
 // External result could be: [MYKEY2: 'AnotherValue', MYKEY4: 'AdditionalValue']

      angular.forEach(data, function (value, key) {
        translations[key] = value;
      });

// Return 'merged' promise

      deferred.resolve(translations);
      return deferred.promise;
    })
  } else {

// Return 'standard' promise

    deferred.resolve(translations);
    return deferred.promise;
  }
   }}})();

调用CustomLoader,

如果外部条件为false,则返回标准承诺并通过$ translate成功解决。

如果外部条件为真,我可以看到外部后端被调用,我甚至看到了结果,但是我得到了一个'无法读取。然后未定义',因为看起来承诺不正确。

有人可以帮我解决这个问题吗?我已经尝试了很多(包括一些绝望的$ q.all,。等等)。

不幸的是,使用部分加载器(由angular-translate提供)不是替代方案。

1 个答案:

答案 0 :(得分:2)

isCondition()为真时,您未从函数中返回任何内容。

您还使用了不推荐使用的success(),并且不允许链接承诺。

如果http呼叫失败,你永远不会拒绝你的承诺。这也是使用链接自动解决的。

代码应该看起来像

function (options) {

  var translations_en = {
    MYKEY1: 'Value1',
    MYKEY2: 'Value2',
    MYKEY3: 'Value3'
  };

  var translations_de = {
    MYKEY1: 'Wert1',
    MYKEY2: 'Wert2',
    MYKEY3: 'Wert3'
  };

  var translations;

  // Standard Dataset for Translations based on options.key (= language key)

  if (options.key === 'en') {
    translations = translations_en;
  } else {
    translations = translations_de;
  }

 // If some condition is met call external backend and retrieve additional data

  if (ExternalService.isCondition()) {
    return $http({
      method: 'GET',
      params: {
        lang: options.key
      },
      url: ENV.apiEndpoint + 'api/v1/translations'
    }).then(function (response) {

      // Now replace/add data in variable 'translations' by external result
      // External result could be: [MYKEY2: 'AnotherValue', MYKEY4: 'AdditionalValue']

      angular.forEach(response.data, function (value, key) {
        translations[key] = value;
      });

      // Return 'merged' promise

      return translations;
    });
  } else {
    return $q.when(translations);
  }
}