2012-02-21 189 views
3

我打电话用下面的代码的函数:JavaScript函数没有返回值

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

打开FireFox + Firebug,打开NET选项卡并查看您的AJAX请求和响应。这可能会给你一个线索。 – 2012-02-21 20:24:09

回答

15

该函数未返回值,因为方法中的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 
}); 

最后一个注意事项,如果你打算用毯子试试/赶在那里,你应该改变,要使用回调也:

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

不过说真的,我建议只采取任何的try/catch排除所有。我看不出在这里可能会有帮助。它只会隐藏已有的具有更好的错误处理结构的代码的实际问题。我怀疑你只是在那里调试这个返回问题,但如果它已经在那里,就把它拿出来。

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

+0

你说得对,这就是为什么我把try/catch放到函数中,并且在脚本写入过程中的某一时刻,try/catch包括coldfusion cfc。非常感谢。 – 2012-02-22 15:03:34

2

Ajax调用是异步的。您必须在$ .ajax()的成功回调中使用您的结果。