在我们的一个旧的"保存数据"示例中,我们以前使用过以下方法,它在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中,它完成了第一个线程,最后完成了第二个流