Javascript de la fonction ne retourne pas de valeur
Je suis l'appel d'une fonction avec le code suivant:
var resultz = nsEditor.updateStringCall(debtID, column2Change, value2Change, 4, 10);
La fonction qui est appelée, mais ne retourne pas une valeur
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
}, //fin de la updateStringCall
Cette fonction utilise l' .ajax pour appeler un coldfusion cfc méthode 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>
La requête s'exécute correctement, mais le js fonction ne retourne pas une valeur (il se présente comme non-défini). Même s'il fait une erreur, je pense que j'ai représenté assez pour que d'obtenir au moins une valeur de retour.
Idées?
Ouvrir FireFox+Firebug, ouvrez l'onglet NET et de regarder votre requête AJAX et de la réponse. Cela peut vous donner un indice.
OriginalL'auteur Michael BW | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
La fonction ne retourne pas une valeur parce que la
return
s dans votre méthode, sont intégrées à l'intérieur des fonctions de rappel. Ils ne sont que le retour de ces rappels, pas de votre fonction principale. Considérons, par exemple, votre "succès" de rappel:Ce
return
est juste de retour de lasuccess
fonction... Il ne fait pas de bulle jusqu'à votreupdateStringCall
fonction.La raison qu'il a à travailler de cette façon est parce que les appels ajax sont asynchrones. Votre méthode renvoie immédiatement tandis que la demande se produit en arrière-plan. Donc, afin d'obtenir la valeur de retour, vous devez passer dans un rappel qui a accès à la valeur quand il est prêt, et ensuite appeler la fonction de rappel à partir de l'intérieur de l'ajax rappels au lieu de retourner une valeur.
Afin de changer votre méthode de définition:
Puis dans vos rappels ajax, l'appeler au lieu de retourner une valeur:
Enfin, passer un rappel lorsque vous appelez cette méthode:
Une dernière remarque, si vous allez avoir cette couverture try/catch là, vous devriez changer que pour utiliser la fonction de rappel également:
Mais vraiment, je vous recommande juste de prendre try/catch complètement. Je ne vois pas comment cela peut éventuellement être utile ici. Il ne fera que masquer les réels problèmes avec le code que déjà a une meilleure structure pour la gestion des erreurs. Je soupçonne que vous venez de mettre en là pour déboguer ce problème de retour, mais si elle était déjà là, il suffit de le prendre.
C'est le monde de l'événementiel de la programmation fonctionnelle! C'est un très commun de sorte de structure en javascript.
OriginalL'auteur Ben Lee
Appels Ajax sont asynchrones. Vous aurez à travailler avec votre résultat à partir de l'intérieur de la réussite de rappel de l' $.ajax().
OriginalL'auteur Jordan