簡體   English   中英

Javascript函數不返回值

[英]Javascript function not returning value

我正在使用以下代碼調用函數:

var resultz = nsEditor.updateStringCall(debtID, column2Change, value2Change, 4, 10);

被調用但不返回值的函數

        updateStringCall: function(pdebtID, pcolumn2Change, pvalue2Change, pmin, pmax){
try {
    var resultz2 = 0;
    $.ajax({
        type: "POST",
        url: "Components/MintLibraries.cfc",
        dataType: "json",
        cache: false,
        data: {
                method: 'StringUpdate',
            val2Change: pvalue2Change.trim(),
            debtID: pdebtID,
            column2Change: pcolumn2Change,
            greaterThan: pmin,
            lesserThan: pmax,
            returnFormat: "json"
        },
        success: function(response) {
                       resultz2 = 1;
          return resultz2;
        },  //end done
        error: function(jqXHR, textStatus, errorThrown){
           resultz2 = 0;
                       return resultz2;
                }); //end ajax call
} catch (e) {
    resultz2 = 0;
    return resultz2;
}  //end trycatch

}, // 結束updateStringCall

此函數使用 .ajax 調用 Coldfusion cfc 方法 StringUpdate:

<cffunction name="StringUpdate" access="remote" output="false" returntype="any" >    
     <cfargument name="val2Change" type="string"  required="true" />
     <cfargument name="debtID"  type="string"  required="true" />
     <cfargument name="column2Change"  type="string"  required="true" />
     <cfargument name="greaterThan"  type="numeric"   required="false" />
     <cfargument name="lesserThan"  type="numeric"  required="false" />
     <cfset var debt2Pass = int(val(arguments.debtID)) />
     <cfset var updQuery = "" />
     <cfset var retValue = 0 />
     <cfset var iVal = 0 /><cfset var valError = '' />
    <cftry>

        <cfquery name="updQuery" datasource="#application.datasource#" result="qResults"    >
                Update dmf set #arguments.column2Change# =
                 <cfqueryparam cfsqltype="cf_sql_varchar" value="#arguments.val2Change#"/>
                 where DebtID = 
                 <cfqueryparam cfsqltype="cf_sql_smallint" value="#arguments.debtID#"/>
        </cfquery> 
        <cfset retValue = 1 />    
     <cfcatch type="Any" >
                <cfset thrown = ThrowCFError(405,'debug',  'Error updating ' &  arguments.DebtID,arguments.val2Change & ', ' &  arguments.debtID & ',' & arguments.column2Change)  />
                  <cfset retValue = 0 />
         </cfcatch>
         </cftry>
    <cfreturn retValue />
</cffunction>

查詢成功運行,但 js 函數不返回值(顯示為未定義)。 即使出現錯誤,我認為我已經考慮到了至少可以獲得一個返回值。

想法?

該函數未返回值,因為方法中的return值嵌入在回調函數中。 它們只是從那些回調中返回,而不是從主函數返回。 例如,考慮一下你的“成功”回調:

success: function(response) {
    resultz2 = 1;
    return resultz2;
}

這個return只是從success函數返回...它沒有冒泡到你的updateStringCall函數。

它必須以這種方式工作的原因是因為ajax調用是異步的。 當請求在后台發生時,您的方法立即返回。 因此,為了獲得返回值,您必須傳入一個在它准備就緒時可以訪問該值的回調,然后從ajax回調中調用回調而不是返回值。

所以將方法定義更改為:

// Note I added a "callback" parameter
function(pdebtID, pcolumn2Change, pvalue2Change, pmin, pmax, callback) { ... }

然后在你的ajax回調中,調用它而不是返回一個值:

success: function(response) {
    resultz2 = 1;
    callback(resultz2);
},
error: function(jqXHR, textStatus, errorThrown) {
    resultz2 = 0;
    callback(resultz2);
});

最后,在調用此方法時傳入回調:

nsEditor.updateStringCall(debtID, column2Change, value2Change, 4, 10, function(resultz) {
    // Do something with resultz
});

最后要注意的是,如果要在那里進行毯子try / catch,你應該改變它以使用回調:

catch (e) {
    resultz2 = 0;
    callback(resultz2);
}

但實際上,我建議完全接受嘗試/捕獲。 我看不出這可能對你有什么幫助。 它只會隱藏已經具有更好的錯誤處理結構的代碼的實際問題。 我懷疑你只是在那里調試這個返回問題,但如果已經存在,那就把它拿出去吧。

這是事件驅動的函數式編程世界! 這是javascript中一種非常常見的結構。

Ajax調用是異步的。 你必須在$ .ajax()的成功回調中使用你的結果。

像這樣添加“異步:假”:

type: "POST",
async: false,
url: "Components/MintLibraries.cfc",
dataType: "json",
cache: false,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM