Javascript函数没有返回值

Mic*_* BW 3 javascript coldfusion jquery

我用以下代码调用函数:

var resultz = nsEditor.updateStringCall(debtID, column2Change, value2Change, 4, 10);
Run Code Online (Sandbox Code Playgroud)

正在调用的函数但不返回值

        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
Run Code Online (Sandbox Code Playgroud)

},//结束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>
Run Code Online (Sandbox Code Playgroud)

查询成功运行但js函数未返回值(显示为未定义).即使它出错了,我认为我已经足够考虑至少得到一个返回值.

想法?

Ben*_*Lee 18

该函数未返回值,因为return方法中的s嵌入在回调函数中.它们只是从那些回调中返回,而不是从主函数返回.例如,考虑一下你的"成功"回调:

success: function(response) {
    resultz2 = 1;
    return resultz2;
}
Run Code Online (Sandbox Code Playgroud)

return只是从success函数返回...它没有冒泡到你的updateStringCall功能.

它必须以这种方式工作的原因是因为ajax调用是异步的.当请求在后台发生时,您的方法立即返回.因此,为了获得返回值,您必须传入一个在它准备就绪时可以访问该值的回调,然后从ajax回调中调用回调而不是返回值.

所以将方法定义更改为:

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

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

success: function(response) {
    resultz2 = 1;
    callback(resultz2);
},
error: function(jqXHR, textStatus, errorThrown) {
    resultz2 = 0;
    callback(resultz2);
});
Run Code Online (Sandbox Code Playgroud)

最后,在调用此方法时传入回调:

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

最后要注意的是,如果你要在那里进行毯子try/catch,你应该改变它以使用回调:

catch (e) {
    resultz2 = 0;
    callback(resultz2);
}
Run Code Online (Sandbox Code Playgroud)

但实际上,我建议完全接受尝试/捕获.我看不出这可能对你有什么帮助.它只会隐藏已经具有更好的错误处理结构的代码的实际问题.我怀疑你只是在那里调试这个返回问题,但如果已经存在,那就把它拿出去吧.

这是事件驱动的函数式编程世界!这是javascript中一种非常常见的结构.