#javascript #ios #cordova #backbone.js #wkwebview
#javascript #iOS #cordova #backbone.js #wkwebview
Вопрос:
В одном из наших старых примеров ‘Сохранения данных’ мы ранее использовали следующее, и оно работало нормально без каких-либо проблем в cordova UIWebView.
var filenameID;
function getFilenameID() {
$.ajax('/jquery/getdata', // request url
{
success: function (data, status, xhr) {// success callback function
kp_requestKioskId_callback(data);
}});
}
function kp_requestKioskId_callback(kioskId) {
filenameID = kioskId.split(" ").join("");
}
function saveData(fileName, data) {
getFilenameID();
kp_FileAPI_writeToFile(filenameID ".xls", data, "writeFile_callback");
}
После перехода с UIWebView на WKWebView в WKWebView, поскольку код JavaScript выполняется асинхронно, вызов ‘getFilenameID’ не завершается до выполнения вызова ‘kp_FileAPI_writeToFile’, что приводит к неопределенному имени файла.
Копирование функции kp_FileAPI_writeToFile внутри kp_requestKioskId_callback решит проблему.
Но у нас есть много подобных функций в нашем приложении.
Есть ли способ решить или отключить асинхронное выполнение javascript, чтобы избежать серьезных изменений в приложении
Ответ №1:
Есть ли способ решить или отключить асинхронное выполнение javascript, чтобы избежать серьезных изменений в приложении
Нет, в современных браузерах / веб XmlHttpRequest
-просмотры (которые $.ajax
используются за кулисами) запрещают синхронные запросы из основного потока. Флаг для отключения асинхронного поведения все еще существует, но большинство браузеров выдадут исключение, если вы используете его внутри основного потока.
Вы можете использовать синхронный XMLHttpRequest внутри web workers, но это не делает ваше приложение синхронным, и вы также не можете использовать API плагинов Cordova из web workers, так что вы найдете это довольно ограниченным.
В примере кода показано, что вы даже не используете эту async
опцию, и по умолчанию для этой опции установлено значение true
, что означает, что ваш сетевой запрос, выполняемый на UIWebView
, также выполнялся асинхронно, поэтому у вас есть недетерминированное условие гонки.
Ответ №2:
Я никогда не сталкивался с этой проблемой в UIWebView, после перехода на WKWebView код javascript ведет себя асинхронно.
Например: у нас есть 3 вызова API, которые зависят друг от друга для одного продукта
Рассмотрим, есть ли у нас 2 продукта, мы повторяем продукты в цикле и запускаем 3 API для каждого продукта.
В WKWebView завершается первый поток и, наконец, 2-й поток