2012-02-21 151 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()的成功回調中使用您的結果。