Cordova 在循环内检查 appAvailability 失败。如何让循环等到 appAvailability.check 执行?

Posted

技术标签:

【中文标题】Cordova 在循环内检查 appAvailability 失败。如何让循环等到 appAvailability.check 执行?【英文标题】:Cordova fails in checking appAvailability inside loop.How can i make loop wait until appAvailability.check execute? 【发布时间】:2015-07-31 11:49:02 【问题描述】:

这是从我的网站加载应用程序名称的 getapps 函数。

getapps = function (applist)   
var xmlhttp = new XMLHttpRequest();
var url = "http://mywebsite.com/"+applist;
xmlhttp.onreadystatechange = function() 
    if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
        var myArr = JSON.parse(xmlhttp.responseText);
        myFunction(myArr);
    

xmlhttp.open("GET", url, true);
xmlhttp.send();

    function myFunction(data) 
    var i;
    var query = data.data;
        if(query != '')
            for(i = 0; i < query.length; i++) 
                var appinstall='';
                appAvailability.check(
                    query[i].appid,       // URI Scheme or Package Name
                    function()   // Success callback
                         appinstall = "is available :)";
                        console.log(query[i].appid+"is available :)");
                    ,
                    function()   // Error callback
                        appinstall = "is not available :(";
                        console.log(query[i].appid+"is not available :(");
                    
                );
                console.log(appinstall);

            
        
    


console.log 位于 appAvailability.check 之外的函数首先触发 n 次 在接下来的几秒钟内 console.log 位于 appAvailability.check 内部的函数会触发 n 次,但出现错误 undefined appid。

我通过删除 for 循环和预定义 appid 进行了测试,它运行良好且没有错误。

如何通过让循环等待appAvailability.check 完成来解决这个问题?

【问题讨论】:

【参考方案1】:

这是因为appAvailability.check 执行了成功和失败的回调。

我强烈怀疑您的代码正在该回调中进行本机调用,该回调在您的回调执行后运行该回调。

您可以使用递归解决此问题,如下所示:

function getApps(appslist) 
    var xmlhttp = new XMLHttpRequest(),
        url = "http://mywebsite.com/"+applist;

    callback = callback || function() ;

    xmlhttp.onreadystatechange = function() 
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
            var data = JSON.parse(xmlhttp.responseText);

            if (data != '')
                checkApp(data.data);
            
        
    

    xmlhttp.open("GET", url, true);
    xmlhttp.send();


function checkApp(applist, callback) 
    var app = applist.push();

    if (!app) 
        callback();
        return;
    

    appAvailability.check(
        app.appid,      // URI Scheme or Package Name
        function()     // Success callback
             console.log(app.appid + "is available");

             // handle availability here

             checkApp(applist, callback);
        ,
        function()   // Error callback
            console.log(app.appid + "is not available");

            // handle absence here

            checkApp(applist, callback);
        
    );

【讨论】:

检查我的更新 - 基本上使用递归从回调中调用函数

以上是关于Cordova 在循环内检查 appAvailability 失败。如何让循环等到 appAvailability.check 执行?的主要内容,如果未能解决你的问题,请参考以下文章

Cordova 地理定位插件问题

我可以在没有循环的情况下检查数组/向量内的单词吗?

带锁的循环内线程执行

[Cordova inAppBrowser 在App内打开浏览器]

Cordova 自动更新应用程序文件夹

使用 Cordova 10 的应用内 AJAX 无法在 iOS 中运行