在我们的一个较老的“保存数据”的例子中,我们以前使用了以下内容,它在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执行,以避免对应用程序进行重大更改
2条答案
按热度按时间u4vypkhs1#
是否有办法解决或禁用异步javascript执行,以避免对应用程序进行重大更改
不,在现代的浏览器/webviews中
XmlHttpRequest
($.ajax
在后台使用)不允许主线程的同步请求。禁用异步行为的标志仍然存在,但是如果你在主线程中使用它,大多数浏览器会抛出一个异常。您可以在Web工作者中使用同步XmlHttpRequest,但这并不能使您的应用程序同步,而且您也不能从Web工作者中使用Cordova插件API,因此您会发现这很有限制性。
代码示例显示您甚至没有使用
async
选项,默认情况下,该选项设置为true
,这意味着在UIWebView
上运行的网络请求也是异步运行的,因此存在不确定性争用条件。xmakbtuz2#
我从来没有在UIWebview上遇到过这个问题,迁移到WKWebview后,JavaScript代码表现不同步。
例如:我们有3个API调用,它们依赖于单个产品的一个接一个
假设我们有2个产品,我们在循环中迭代这些产品,并为每个产品触发3个API。
在WKWebview中,它完成第一个线程,最后完成第二个流