从iOS cordova UIwebview到wkwebview的迁移禁用异步javascript执行以支持现有应用程序



在我们的一个旧的"保存数据"示例中,我们以前使用过以下方法,它在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代码是异步执行的,在执行"kp_FileAPI_writeToFile"调用之前,"getFilenameID"调用未完成,导致文件名未定义。

在kp_requestKioskId_callback中复制kp_FileAPI_writeToFile函数将解决此问题。

但在我们的应用程序中,我们有许多类似的功能。

有没有办法解决或禁用异步javascript执行,以避免应用程序发生重大更改

有没有办法解决或禁用异步javascript执行,以避免应用程序发生重大更改

否,在现代浏览器/Webview中,XmlHttpRequest(这是$.ajax在幕后使用的(不允许来自主线程的同步请求。禁用异步行为的标志仍然存在,但如果您在主线程中使用它,大多数浏览器都会抛出异常。

您可以在web工作程序中使用同步XmlHttpRequest,但这并不能使您的应用程序同步,而且您也不能从web工作程序使用Cordova插件API,因此您会发现这非常有限。

代码示例显示您甚至没有使用async选项,默认情况下该选项设置为true,这意味着您在UIWebView上运行的网络请求也是异步运行的,因此存在不确定的竞争条件。

我从未在UIWebview上遇到过这个问题,在迁移到WKWebview后,javascript代码表现为异步。

例如:我们有3个API调用,它们一个接一个地依赖于单个产品

考虑一下,如果我们有2个产品,我们将在一个循环中迭代这些产品,并为每个产品触发3个API。

在WKWebview中,它完成了第一个线程,最后完成了第二个流

最新更新