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
}, // 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 许可协议

阅读 538
2 个回答

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

最后要注意的是,如果你打算在那里进行全面的 try/catch,你应该将其更改为也使用回调:

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

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

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

原文由 Ben Lee 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

原文由 Jordan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题