ECMAScript 6 имеет «генераторы», которые позволяют вам легко программировать в асинхронном стиле.
function* myGenerator() {
const callback = yield;
let [response] = yield $.ajax("https://stackoverflow.com", {complete: callback});
console.log("response is:", response);
// examples of other things you can do
yield setTimeout(callback, 1000);
console.log("it delayed for 1000ms");
while (response.statusText === "error") {
[response] = yield* anotherGenerator();
}
}
Для запуска вышеуказанного кода вы делаете это:
const gen = myGenerator(); // Create generator
gen.next(); // Start it
gen.next((...args) => gen.next([...args])); // Set its callback function
Если вам нужно настроить таргетинг на браузеры, которые не поддерживают ES6, вы можете запустить код через Babel или short-compiler для генерации ECMAScript 5.
Обратный вызов ...args
завернут в массив и разрушен, когда вы их читаете так что шаблон может справиться с обратными вызовами, которые имеют несколько аргументов. Например, с узлом fs :
const [err, data] = yield fs.readFile(filePath, "utf-8", callback);
Решение, которое мне удалось достичь с помощью опытного ng-dev в группе Google AngularJS, это библиотека xDomain .
Настройка очень просто, просто поместите файл proxy.html в корень вашего API, с регулярным выражением / строкой для разрешенного источника («мастер») и ссылкой на скрипт во внешнем интерфейсе, а затем укажите этот файл из вашего интерфейса скрипт ('master').
Он работает, открывая файл proxy.html в iframe и общающийся с ресурсом CORS с помощью postMessage
.
Работает как шарм с как $ http и $ resource.
Вы также можете поддерживать нормальное функционирование для обычных браузеров, поставив скрипт выше всех библиотек JavaScript:
<!--[if lte IE 9]>
<script src="xdomain.js" slave="http://example.org/proxy.html"></script>
<![endif]-->
В моем случае Response Headers
содержит
Content-Type:application/json; charset=UTF-8
, и это проблема для IE9, поскольку он не может правильно обрабатывать / анализировать объекты JSON в ответах.
Переключение Response Headers
в
Content-Type:text/plain; charset=UTF-8
Кроме того, убедитесь, что для IE9 включен следующий модуль: https: // stackoverflow. com / a / 28905072/1202371
разрешено получать ответ в тексте, а затем преобразовывать его в объект JSON.
Конечно, ваша проблема связана с CORS. IE10 использует настоящий XmlHttpRequest, но до этого IE этого не делал. Безусловно, самый простой способ решить эти проблемы - использовать apache или nginx для прокси API. Например, с nginx, на вашем сервере {}
block:
location /api {
proxy_pass http://my.server.name:12345/v1;
proxy_redirect off;
}
Обратите внимание, что даже jQuery не поддерживает XDomainRequest и CORS прямо, вам нужно добавить плагин для получения XDR. Также обратите внимание: XDR имеет некоторые серьезные ограничения в отношении CORS.