如何从WinJS返回值

时间:2014-01-02 18:12:58

标签: javascript web-services winjs

我正在开发一个使用像这样的WebService的应用程序

function  callWS(filebytes, fpath, filename) { //consumes the webservice
    var response;
    var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.myCompany.com">\n' +
                '   <soapenv:Header/>\n' +
                '       <soapenv:Body>\n' +
                '           <ws:uploadFileService>\n' +
                '           <ws:filebytes>' + filebytes + '</ws:filebytes>\n' +
                '           <ws:fpath>' + fpath + '</ws:fpath>\n' +
                '           <ws:filename>' + filename + '</ws:filename>\n' +
                '           </ws:uploadFileService>\n' +
                '       </soapenv:Body>\n' +
                '</soapenv:Envelope>\n';
    console.log("XML SOAP: " + data + "\r\n");

    var options = {
        url: "http://XXX.XXX.XX.XXX:XXXX/FILESERVERWS/services/FILESERVERWS?wsdl",
        type: "post",
        headers: {
            "Content-Type": "text/xml; charset=utf-8",
            "SOAPAction": "uploadFileService"
        },
        data: data
    };

    WinJS.Promise.timeout(8000, WinJS.xhr(options)).then(
        function (request) {
            var doc = request.responseXML.documentElement;
            var output = doc.getElementsByTagName("uploadFileServiceReturn");

            //Windows.UI.Popups.MessageDialog(output[0].textContent, "the XML message").showAsync();

            console.log("the XML message: " + output[0].textContent + "\r\n");

            result.style.backgroundColor = "#00A000";
            response = true;
        },
        function (error) {
            Windows.UI.Popups.MessageDialog(error.status + " : " + error.statusText, "Status").showAsync();
            result.style.backgroundColor = "#FF0000";

            response = false;
        },
        function (progress) {
            result.innerText = "Ready state is " + progress.readyState;
            result.style.backgroundColor = "#0000A0";
        }

        );
    return response;
}

目的是使用webService并返回值

成功响应= true on error response = false

因为我想采取行动取决于webService是否通过执行此操作返回了值

 if (callWS(document.getElementById("formfield" + i).value, UID_KEY[7], arrayCaptures[i - 1].name)) {
                    console.log("take action a");
                }
                else {
                    console.log("take action b");
                }

但是即使使用了webService也总是采取行动B并且我从网络服务得到答案,我做错了什么???

1 个答案:

答案 0 :(得分:2)

您需要从函数中返回Promise个对象,允许调用脚本使用then()done()调用来获取结果。您可以在msdn网站上阅读有关asynchronous programming in WinJS的更多信息,但通常看起来像这样:

function  callWS(filebytes, fpath, filename) {
    return new WinJS.Promise(function (complete, error) {
        // put your functionality here...

        WinJS.Promise.timeout(8000, WinJS.xhr(options)).then(
            function (request) {
                // more processing...

                complete(true); // or false or a variable...
            },
            function (e) {
                // error handling unique to this function
                complete(false);  // OR you could just call error(e);
            },
            ...
        );
    });
}

你会像这样使用它:

callWS( ... ).then(
    function(response) {
        // handle response...
        // will be either true or false
    },
    function(err) {
        // handle errors
    }
);