Javascript 为什么在执行函数时有两个不同的值?

Javascript 为什么在执行函数时有两个不同的值?,javascript,jquery,Javascript,Jquery,我不知道为什么,但是当我只运行(kpis1)时,我会得到结果(100),而当我只运行(kpis2)时,我会得到结果(97) 当运行这两个函数时,结果变成kpis1=100,但kpis2=70 为什么函数对单个参数给出了正确的结果,而当我放置两个参数时给出了错误的结果 <script src="../../scripts/jquery-1.4.4.min.js" type="text/javascript"></script> <script type="text/j

我不知道为什么,但是当我只运行(kpis1)时,我会得到结果(100),而当我只运行(kpis2)时,我会得到结果(97)

当运行这两个函数时,结果变成kpis1=100,但kpis2=70

为什么函数对单个参数给出了正确的结果,而当我放置两个参数时给出了错误的结果

<script src="../../scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
<script type="text/jscript">
var isProd = true;
var MAX_PROCESS_PER_ELEMENT = 30;
var NUMBER_OF_ELEMENT = 11;
var elements = new Array(NUMBER_OF_ELEMENT);
var totalRolled = 0;
var totalDeveloped = 0;
var totalImplement = 0;
var totalCount = 0;
var totalOwners = 0;
var totalChampions = 0;
var totalAssessed = 0;
var totalItemsClosed = 0;
var totalItemsPending = 0;

var chartIm;

var colors = ["31116e", "5e646f", "009861", "005b8c", "874614", "cc202b", "b85c27", "eb8030", "005a5a", "5ca6de", "842790"];
var bgColor = "fcfdfd"; //"feeebd";
var chartAlpha = 60;

var COLUMN_NO = "ows_No";
var COLUMN_TITLE = "ows_Title";
var COLUMN_ID = "ows_ID";
var COLUMN_LINK = "ows_Link";
var COLUMN_ELEMENT = "ows_Element";
var COLUMN_OWNER = "ows_Owner";
var COLUMN_PROCESS_WEIGHT = "ows_Weight_x0025_";
var COLUMN_IMPLM_SCORE = "ows_Aduit_x0020_Score";
var COLUMN_IS_DEVELOPED = "ows_Developed";
var COLUMN_IS_ROLLED_OUT = "ows_Rolled_x0020_Out";
var COLUMN_IS_ASSESSED = "ows_Assessed";
var COLUMN_CYCLE = "ows_Assessment_x0020_Cycle";
var COLUMN_ACTION_ITEMS = "ows_Identified_x0020_GAP";
var COLUMN_LPCR = "ows_LPCR_x0020_GAPs";
var COLUMN_OTHER_GAPS = "ows_Other_x0020_GAPs";
var COLUMN_ACTION_COUNT = "ows__x0023__x0020_GAPs";
var COLUMN_ACTION_CLOSED = "ows_ClosedGaps";
var COLUMN_ACTION_PENDING = "ows_Pending_x0020_GAPs";
var COLUMN_CHAMPION = "ows_Champion";
var COLUMN_RESPONS_PERSONS = "ows_Res";
var COLUMN_RESPONS_PERSONS = "ows_Res";
var KPI_MATRIX = new Array();
var plannedEventTD = 0;
var doneEventTD = 0;
var alertMessage;

function loadSmsXmlData(sSmsXml2) {

        var sSmsXml = "https://sharepoint.com/orgs/_vti_bin/owssvr.dll?";
        sSmsXml += "Cmd=Display&XMLDATA=TRUE&Query=*?&List="+sSmsXml2;
        $.ajax({ url: (isProd ? sSmsXml : "sms.xml"),
            type: "POST", dataType: "xml",async: false,
            data: "", cache: false ,
            contentType: "text/xml; charset=\"utf-8\"",cache:false
            ,complete: processSmsResult
            ,error: function(xml,status,msg) {alert("Error in Loading the SMS Process Data \n error code:" + msg)} 
    });

 var out = [totalImplement,"Total Implement"];
alert(out);
return out;

function processSmsResult(xData, status) {

    $(xData.responseXML).children(1).children(1).children().each(function () {
        var currentElement;
        if (!isNaN($(this).attr(COLUMN_NO))) {

            var elementNo = parseInt($(this).attr(COLUMN_NO), 10);

            if (elements[elementNo - 1] == undefined) {
                var currentElement = new Element();
                currentElement.no = elementNo;
                currentElement.champion = $(this).attr(COLUMN_CHAMPION);
                currentElement.title = $(this).attr(COLUMN_ELEMENT);
                elements[elementNo - 1] = currentElement;
            }
            else { currentElement = elements[elementNo - 1] };
            var process = new Process();
            process.no = parseFloat($(this).attr(COLUMN_NO)).toFixed(2);
            if ($(this).attr(COLUMN_ACTION_CLOSED))
                process.actionClosed = parseInt($(this).attr(COLUMN_ACTION_CLOSED).substring($(this).attr(COLUMN_ACTION_CLOSED).indexOf("#") + 1), 10);
            if ($(this).attr(COLUMN_ACTION_COUNT))
                process.actionCount = parseInt($(this).attr(COLUMN_ACTION_COUNT), 10);
            if ($(this).attr(COLUMN_ACTION_ITEMS))
                process.ActionItems = $(this).attr(COLUMN_ACTION_ITEMS);
            if ($(this).attr(COLUMN_ACTION_PENDING))
                process.actionPending = parseInt($(this).attr(COLUMN_ACTION_PENDING), 10);
            if ($(this).attr(COLUMN_CYCLE))
                process.cycle = $(this).attr(COLUMN_CYCLE);
            if ($(this).attr(COLUMN_ID))
                process.id = parseInt($(this).attr(COLUMN_ID), 10);
            if ($(this).attr(COLUMN_IS_ASSESSED))
            if ($(this).attr(COLUMN_IS_ASSESSED).length > 5)
                process.isAssessed = $(this).attr(COLUMN_IS_ASSESSED).substring(0, $(this).attr(COLUMN_IS_ASSESSED).lastIndexOf(" "));
            if ($(this).attr(COLUMN_IMPLM_SCORE))
                process.implmScore = parseInt(parseFloat($(this).attr(COLUMN_IMPLM_SCORE)) * 100, 10);
            if ($(this).attr(COLUMN_IS_DEVELOPED))
                process.isDeveloped = $(this).attr(COLUMN_IS_DEVELOPED);
            if ($(this).attr(COLUMN_IS_ROLLED_OUT))
                process.isRolledout = $(this).attr(COLUMN_IS_ROLLED_OUT);
            if ($(this).attr(COLUMN_ACTION_COUNT))
                process.actionCount = parseInt($(this).attr(COLUMN_ACTION_COUNT), 10);
            if ($(this).attr(COLUMN_ACTION_ITEMS))
                process.actionItems = $(this).attr(COLUMN_ACTION_ITEMS);
            if ($(this).attr(COLUMN_LINK))
                process.link = $(this).attr(COLUMN_LINK).substring(0, $(this).attr(COLUMN_LINK).indexOf(", "));
            if ($(this).attr(COLUMN_LPCR))
                process.LPCR = $(this).attr(COLUMN_LPCR);
            if ($(this).attr(COLUMN_OTHER_GAPS))
                process.otherGaps = $(this).attr(COLUMN_OTHER_GAPS);
            if ($(this).attr(COLUMN_PROCESS_WEIGHT))
                process.processWeight = (parseInt(parseFloat($(this).attr(COLUMN_PROCESS_WEIGHT).substring($(this).attr(COLUMN_PROCESS_WEIGHT).indexOf("#") + 1) * 100), 10));
            if ($(this).attr(COLUMN_TITLE))
                process.title = $(this).attr(COLUMN_TITLE);
            if ($(this).attr(COLUMN_TITLE))
                process.owner = $(this).attr(COLUMN_OWNER).replace(/^\s+|\s+$/g, "");
            if ($(this).attr(COLUMN_RESPONS_PERSONS))
                process.responsPersons = $(this).attr(COLUMN_RESPONS_PERSONS);
            process.implmScore = process.implmScore - (3*process.actionPending);
            currentElement.processes[parseInt(process.no.toString().substring(process.no.toString().indexOf(".") + 1), 10)] = process;
            process.scoreToElement = process.processWeight * process.implmScore / 100;
            currentElement.itemsClosed += process.actionClosed;
            currentElement.itemsPending += process.actionPending;
            totalItemsClosed += process.actionClosed;
            totalItemsPending += process.actionPending;
            currentElement.processesCount++;
            currentElement.implementation += process.scoreToElement;
            currentElement.fullScore += process.processWeight;
            if (process.isAssessed.toUpperCase().length > 6)
                currentElement.assessedProcesses++;
            if (process.isDeveloped.toUpperCase().indexOf("YES") > -1)
                currentElement.developedProcesses++;
            if (process.isRolledout.toUpperCase().indexOf("YES") > -1)
                currentElement.rolledoutProcesses++;
        } 

    });                    

        $(elements).each(function () {
        totalCount += this.processesCount;
        totalRolled += this.rolledoutProcesses;
        totalDeveloped += this.developedProcesses;
        totalAssessed += this.assessedProcesses;
        this.implementation = 100 * this.implementation / this.fullScore;
        totalImplement += this.implementation;
    });
      totalImplement /= NUMBER_OF_ELEMENT;

} 

function Element() {
    this.no = 0;
    this.title = "";
    this.champion = "";
    this.processesCount = 0;
    this.rolledoutProcesses = 0;
    this.developedProcesses = 0;
    this.assessedProcesses = 0;
    this.itemsClosed = 0;
    this.itemsPending = 0;
    this.implementation = 0;
    this.fullScore = 0;
    this.processes = new Array(MAX_PROCESS_PER_ELEMENT);
}
function Process() {
    this.title = "";
    this.id = -1;
    this.no = 0;
    this.link = "#";
    this.owner = "";
    this.processWeight = 0;
    this.scoreToElement = 0; 
    this.implmScore = 0;
    this.isDeveloped = "";
    this.isRolledout = "";
    this.isAssessed = "";
    this.cycle = "";
    this.ActionItems = "N/A";
    this.LPCR = "";
    this.otherGaps = "";
    this.actionCount = 0;
    this.actionClosed = 0;
    this.actionPending = 0;
    this.responsPersons = "(set)";
}
}


这是我的JSFIDLE

这是因为在
processSmsResult
函数中,您正在修改全局变量
totalImplement
,因此在对同一函数的后续调用中,该变量将具有不同的值。这就是为什么你会得到两种不同的输出

另一件需要注意的事情是:

 var out = [totalImplement,"Total Implement"];
alert(out);
return out;

此代码段应位于末尾的
processSmsResult
函数中。因为您正在修改ajax函数的成功回调中的响应数据,该函数本质上是异步的

代码中有大量问题需要解决:

  • 一旦正确缩进,很明显您的函数实际上是嵌套的,但它们不能以这种方式工作
  • 您必须彻底摆脱
    async:false
    ,因为这会导致比它解决的问题更多的问题!然后,您将遇到这样的情况:在启动异步操作后立即尝试使用从异步操作返回的数据,但不等待结果。这就像“订购比萨饼,然后在送货前试着吃掉它”:
  • 您需要在函数中使用回调,或者使用jQuery承诺。回调更容易理解,但承诺是一个更干净的选择
  • 您希望函数返回结果,但函数不返回任何内容
  • 在处理函数中不使用
    状态
    ,因此不要传递它
假设
processSmsResult
也不是一个异步操作,您可以将其模式设置为:

loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D", function(data, status){
            var kpis = processSmsResult(data);
            // Now you can alert the result of this operation
        });
loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D").done(function (function (data) {
        kpis = processSmsResult(data);
        // Now you can alert the result of this operation
}).fail(function (hdr, textStatus) {
        alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
var load1 = loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D");
var load2 = loadSmsXmlData("%7B0EE4A087%2DDAF4%2D49F5%2DB4DF%2D413AF23B6C7C%7D");
$.when(load1, load2).done(function(data1, data2){
    // both complete, process the results
    var kpis1 = processSmsResult(data1);
    var kpis2 = processSmsResult(data2);
}).fail(function(hdr, textStatus){
    alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
回调版本: 然后像这样使用:

loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D", function(data, status){
            var kpis = processSmsResult(data);
            // Now you can alert the result of this operation
        });
loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D").done(function (function (data) {
        kpis = processSmsResult(data);
        // Now you can alert the result of this operation
}).fail(function (hdr, textStatus) {
        alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
var load1 = loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D");
var load2 = loadSmsXmlData("%7B0EE4A087%2DDAF4%2D49F5%2DB4DF%2D413AF23B6C7C%7D");
$.when(load1, load2).done(function(data1, data2){
    // both complete, process the results
    var kpis1 = processSmsResult(data1);
    var kpis2 = processSmsResult(data2);
}).fail(function(hdr, textStatus){
    alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
承诺版本: 然后像这样使用:

loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D", function(data, status){
            var kpis = processSmsResult(data);
            // Now you can alert the result of this operation
        });
loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D").done(function (function (data) {
        kpis = processSmsResult(data);
        // Now you can alert the result of this operation
}).fail(function (hdr, textStatus) {
        alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
var load1 = loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D");
var load2 = loadSmsXmlData("%7B0EE4A087%2DDAF4%2D49F5%2DB4DF%2D413AF23B6C7C%7D");
$.when(load1, load2).done(function(data1, data2){
    // both complete, process the results
    var kpis1 = processSmsResult(data1);
    var kpis2 = processSmsResult(data2);
}).fail(function(hdr, textStatus){
    alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
上一个问题是由于尝试将函数的结果分配给变量引起的,例如
kpis1=loadsxmldata
,但该函数不返回任何结果,因此两者都不应工作

在异步世界中,您希望依次或并行地等待两者的成功。因此,将用法更改为如下所示:

loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D", function(data, status){
            var kpis = processSmsResult(data);
            // Now you can alert the result of this operation
        });
loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D").done(function (function (data) {
        kpis = processSmsResult(data);
        // Now you can alert the result of this operation
}).fail(function (hdr, textStatus) {
        alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
var load1 = loadSmsXmlData("%7B474EAAB5%2D25F5%2D4669%2DB677%2DB85587EA40CA%7D");
var load2 = loadSmsXmlData("%7B0EE4A087%2DDAF4%2D49F5%2DB4DF%2D413AF23B6C7C%7D");
$.when(load1, load2).done(function(data1, data2){
    // both complete, process the results
    var kpis1 = processSmsResult(data1);
    var kpis2 = processSmsResult(data2);
}).fail(function(hdr, textStatus){
    alert("Error in Loading the SMS Process Data \n error code:" + textStatus)
});
其他问题: 您需要函数来执行自包含的操作。要避免的事情之一是使用任何全局变量,因为这会引入依赖关系


例如,您可以更改
processSmsResult
函数以实际返回结果。

代码说明:您可以缩短代码,如:
if($(this).attr(COLUMN\u TITLE))process.TITLE=$(this).attr(COLUMN\u TITLE)
只需
process.title=$(this.attr(COLUMN_title)| | process.title
,并删除所有ifs。一些更复杂的操作需要有所不同,但对于简单的检查和分配,这可能会有所帮助:)感谢您的注意……您实际遇到了一些与所示代码相关的问题。我在下面列出了一些备选建议,但您也需要解决一些基本问题(比如您没有从函数返回结果,而是编写了期望返回值的代码!)因此您不应该提供经济奖励(已编辑)。相反,开始尝试下面的建议,并在剩下的问题上给出反馈:)亲爱的Truebluaussie。。。我还在测试你的解决方案。一旦我完成测试,我会回复你。但是,我感谢您的回答和支持,我希望这将帮助我…虽然这回答了明显的问题,但我认为您也可以假设您需要演示如何正确地执行:)虽然他们不应该这样做,但他们使用的是
async:false
,因此这与此无关。谢谢您Mohammed。。。通过尝试你的解决方案,现在我有了不同的结果。1(kpis1)总是正确的,但现在2ed参数(kpis2)的reslut与我通常得到的不同,但仍然不正确。我非常爱你@mohamedrias,你的解决方案是正确的。请给我更多的时间测试一下,我会给你回复的。非常感谢穆罕默德。明天我可能会回复你,因为我想了很久之后需要休息一下。但是,请您向我解释一下为什么将函数向上移动的问题……这是我在运行您的seccript>>>SCRIPT438:Object不支持属性或方法'when'@Khalil:您使用的jQuery版本是什么?它是在1.5中添加的:它是((jquery-1.4.4.min.js))。。。很抱歉,我无法添加此版本,因为它不在列表中jsfiddle@Khalil:非常重要的细节,因为jQuery太旧了。能否更新jQuery(建议您访问1.11.2以了解HTML4兼容性)?如果没有,您将需要使用回调选项。我选择了1.4.4版,因为这是我的稳定版本。我将尝试1.11.2版,然后再与您联系。