Titanium,等待HTTPClient回复

时间:2013-10-18 07:19:47

标签: android titanium httpclient

我正在使用Titanium SDK开发一个小型Android应用程序,该应用程序与远程PHP文件交互以检索其数据。 FOR循环在HTTPClient返回任何数据之前执行,因此'myTest'为空,并且没有任何内容添加到'tblListing'。

function jsonPOST( inAction, inParams ) { // jsonPOST is a global function
    var xhr = Ti.Network.createHTTPClient({
        onload : function(e) {
            Ti.API.info("Received text: " + this.responseText);
            return this.responseText;
        },
        onerror : function(e) {
            Ti.API.debug(e.error);
            alert('error');
            return false;
        },
        timeout : 8000,  // in milliseconds
    });

    var sendData = {
        'action' : inAction,
        'json' : JSON.stringify(inParams)
    };

    xhr.open('POST', "http://domain.com/file.php"); // url redacted
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send( sendData );
} // end. jsonPOST()

var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance
for (i in myTest) {
    tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id });
}

如果不延迟在同一个线程上执行任何其他操作,我怎样才能使FOR循环等待直到HTTPClient返回数据? 'jsonPOST'函数用于检索应用程序中多个元素的各种数据,并且应保持动态。

2 个答案:

答案 0 :(得分:2)

我最终使用回调参数来允许在HTTPClient接收数据后调用函数。这允许jsonPOST函数保持动态。

    function jsonPOST(inAction, inParams, inCallback) {

        var xhr = Ti.Network.createHTTPClient({
            onload : function(e) {
                Ti.API.info("Received text: " + this.responseText);
                var reply = JSON.parse(this.responseText);
                inCallback(reply);
            },
            onerror : function(e) {
                Ti.API.debug(e.error);
                alert('error');

                return false;
            },
            timeout : 8000,  // in milliseconds
        });

        var sendData = {
            'action' : inAction,
            'json' : JSON.stringify(inParams)
        };
        xhr.open('POST', "http://domain.com/file.php"); // url redacted
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xhr.send(sendData);
    }

function processListing(inJson) {
    for (i in inJson) {
        tblListing.appendRow({
            title : inJson[i].listingTitle,
            id : inJson[i].listingID
        });
    }
}

jsonPOST('getListing', null, processListing);

答案 1 :(得分:0)

循环必须位于绑定到xhr对象的onload属性的函数中:

 function jsonPOST( inAction, inParams ) { // jsonPOST is a global function
    var xhr = Ti.Network.createHTTPClient({
        onload : function(e) {
            Ti.API.info("Received text: " + this.responseText);
            for (i in this.responseText) {
              tblListing.appendRow({ title: myTest[i].title, id: myTest[i].id });
            }
            return this.responseText;
        },
        onerror : function(e) {
            Ti.API.debug(e.error);
            alert('error');
            return false;
        },
        timeout : 8000,  // in milliseconds
    });

    var sendData = {
        'action' : inAction,
        'json' : JSON.stringify(inParams)
    };

    xhr.open('POST', "http://domain.com/file.php"); // url redacted
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    xhr.send( sendData );
} // end. jsonPOST()

var myTest = jsonPOST('getlisting'); // only need to pass first param in this instance

请注意,HTTPClient的工作是异步的。它发送请求并等待数据,但同时调用脚本继续执行。