我正在使用以下代码调用函数:
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函数未返回值(显示为未定义)。即使它出现错误,我也认为我已经足够考虑到这一点,至少得到一个返回值。
想法?
答案 0 :(得分:17)
该函数未返回值,因为方法中的return
嵌入在回调函数中。它们只是从那些回调中返回,而不是从主函数返回。例如,考虑一下你的成功&#34;回调:
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
});
最后要注意的是,如果你要在那里进行毯子尝试/捕捉,你应该改变它以使用回调:
catch (e) {
resultz2 = 0;
callback(resultz2);
}
但实际上,我建议只是尝试/赶上。我无法在这看到它可能会有所帮助。它只会隐藏已经具有更好的错误处理结构的代码的实际问题。我怀疑你只是在那里调试这个返回问题,但如果它已经存在,那就把它拿出来。
这是事件驱动的函数式编程世界!它是javascript中一种非常常见的结构。
答案 1 :(得分:2)
Ajax调用是异步的。你必须在$ .ajax()的成功回调中使用你的结果。