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

9lowa7mx  于 2022-11-10  发布在  iOS
关注(0)|答案(2)|浏览(129)

在我们的一个较老的“保存数据”的例子中,我们以前使用了以下内容,它在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执行,以避免对应用程序进行重大更改

u4vypkhs

u4vypkhs1#

是否有办法解决或禁用异步javascript执行,以避免对应用程序进行重大更改
不,在现代的浏览器/webviews中XmlHttpRequest$.ajax在后台使用)不允许主线程的同步请求。禁用异步行为的标志仍然存在,但是如果你在主线程中使用它,大多数浏览器会抛出一个异常。
您可以在Web工作者中使用同步XmlHttpRequest,但这并不能使您的应用程序同步,而且您也不能从Web工作者中使用Cordova插件API,因此您会发现这很有限制性。
代码示例显示您甚至没有使用async选项,默认情况下,该选项设置为true,这意味着在UIWebView上运行的网络请求也是异步运行的,因此存在不确定性争用条件。

xmakbtuz

xmakbtuz2#

我从来没有在UIWebview上遇到过这个问题,迁移到WKWebview后,JavaScript代码表现不同步。
例如:我们有3个API调用,它们依赖于单个产品的一个接一个
假设我们有2个产品,我们在循环中迭代这些产品,并为每个产品触发3个API。
在WKWebview中,它完成第一个线程,最后完成第二个流

相关问题