Лучшие практики для вызова intuit.ipp.anywhere.setup()?

Это вопрос о передовых методах выполнения вызова JavaScript, который генерирует стандартную кнопку «Подключиться к QuickBooks» (для установления соединения с QuickBooks Harmony через REST API Intuit v3).

Если бы я следовал примеру Intuit, я бы:

  1. Ссылка https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js в теге скрипта.
  2. Поместите набор тегов ‹ipp:connectToIntuit›‹/ipp:connectToIntuit› там, где я хочу, чтобы отображалась кнопка «Подключиться к QuickBooks».
  3. Скрестим пальцы и будем надеяться, что intuit.ipp.anywhere.js не перенаправляет на сообщение о простое, опять же все еще существует
  4. Позвоните мне в intuit.ipp.anywhere.setup()
  5. См. кнопку «Подключиться к QuickBooks».

... который работает (для многих значений "работает"), но выглядит довольно хрупким:

  1. Если intuit.ipp.anywhere.js перенаправляет на сообщение о простое (читай: не на JavaScript) или недоступен по иным причинам, я получаю сообщение об ошибке скрипта.
  2. Если я получаю ошибку сценария (или что-то еще идет не так с копией сценария Intuit), пользователь не получает никакой обратной связи, а просто пустое место на месте кнопки «Подключиться к QuickBooks».

Чтобы сделать все это немного более устойчивым, я объединяю ссылку на intuit.ipp.anywhere.js и вызов intuit.ipp.anywhere.setup() в вызов JQuery .ajax():

    $.ajax({
     url: 'https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js', 
     type: 'GET',
     dataType: 'script',
     timeout: 4000,
     success: function(response) {
      if (typeof intuit !== 'undefined') {
       intuit.ipp.anywhere.setup({
        menuProxy: 'MYMENUPROXYURL.aspx',
        grantUrl: 'MYGRANTURL.aspx'
       });
      }
     },
     error: function(x, t, m) {
       // show some friendly error message about Intuit downtime
     }        
    });

... который также работает (еще для нескольких значений «работает»):

  1. Мой вызов setup() заключен внутри обработчика успеха (и дополнительной проверки существования объекта intuit), поэтому я не должен получить ошибку сценария, если что-то пойдет не так.
  2. Если GET скрипта Intuit истечет (через 4000 мс) или вернет что-то, что не является скриптом, я покажу пользователю понятное сообщение об ошибке.

Кто-нибудь еще использовал другой подход? А Intuit снова в сети?


person The Machete    schedule 19.02.2014    source источник
comment
Эй, это выглядит как отличное начало — не заставляет ли это ваш браузер перестать использовать локальный кеш?   -  person Troy Anderson    schedule 14.03.2014
comment
@TroyAnderson Мы используем функцию .getScript, которая по умолчанию устанавливает для кеша значение «false». С сообщением Мачете он мог добавить явный cache: false к .ajax параметрам.   -  person dthagard    schedule 14.03.2014
comment
@TroyAnderson Явное cache: false не требуется для параметров .ajax, так как dataType: script по умолчанию значение кэша будет равно false (ссылка)   -  person Armin Sadeghi    schedule 12.02.2015


Ответы (1)


Это похоже на то, как мы справились с этим. Мы обернули его в вызов jQuery.getScript, но, видимо, обработчик .fail не работает с тегами междоменных скриптов. Наше решение выглядит следующим образом:

<script type="text/javascript>
    var timeoutID;
    timeoutID = window.setTimeout(function () {
        $("#ippConnectToIntuit").replaceWith('<p class="error-message">There was a problem communicating with QuickBooks. The service may be down or in heavy use. Try again later.</p>');
        }, 5000);
    $.getScript("https://appcenter.intuit.com/Content/IA/intuit.ipp.anywhere.js")
        .done(function () {
            window.clearTimeout(timeoutID);
            intuit.ipp.anywhere.setup({
                menuProxy: '/path/to/our/menu/proxy',
                grantUrl: '/path/to/our/grant/url'
            });
        });
</script>
<div id="ippConnectToIntuit"><ipp:connecttointuit></ipp:connecttointuit></div>
person dthagard    schedule 14.03.2014