我正在使用以下代码调用一个函数:
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
}, // end 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 函数没有返回值(它显示为未定义)。即使出现错误,我认为我已经对此进行了足够的解释,至少可以得到一个返回值。
想法?
原文由 Michael BW 发布,翻译遵循 CC BY-SA 4.0 许可协议
该函数未返回值,因为方法中的
return
嵌入在回调函数中。它们只从那些回调中返回,而不是从你的主函数中返回。例如,考虑您的“成功”回调:这个
return
刚刚从success
函数返回……它不会冒泡到你的updateStringCall
函数。它必须以这种方式工作的原因是因为 ajax 调用是异步的。当请求在后台发生时,您的方法会 立即 返回。因此,为了获得返回值,您必须传入一个回调,该回调可以在准备就绪时访问该值,然后从 ajax 回调中调用回调而不是返回值。
因此,将您的方法定义更改为:
然后在您的 ajax 回调中,调用它而不是返回值:
最后,调用此方法时传入回调:
最后要注意的是,如果你打算在那里进行全面的 try/catch,你应该将其更改为也使用回调:
但实际上,我建议完全尝试/捕捉。我看不出这对这里有什么帮助。它只会隐藏 已经 具有更好的错误处理结构的代码的实际问题。我怀疑你只是把它放在那里调试这个返回问题,但如果它已经存在,就把它拿出来。
这就是事件驱动函数式编程的世界!这是 javascript 中非常常见的一种结构。