Récupérer la valeur des variables exécutées dans cfloop à l'aide de la jointure cfthread

StackOverflow https://stackoverflow.com/questions/3248513

  •  15-09-2020
  •  | 
  •  

Question

Merci d'avoir répondu !!Mais je n'y parviens toujours pas.L'erreur que j'obtiens est "Element objget1 n'est pas défini dans un objet Java de la classe de type Coldfusion.runtime.variblescope."

Ci-dessous mon code complet.Je veux juste vider la valeur de chaque thread contenant des informations cfhttp.

http://www.google.com/search?" & "q=Vin+Diesel" & "&num=10" & "&start=") />

<cfset intStartTime = GetTickCount() />

<cfloop index="intGet" from="1" to="10" step="1">

    <!--- Start a new thread for this CFHttp call. --->
    <cfthread action="run" name="objGet#intGet#">

        <cfhttp method="GET" url="#strBaseURL##((intGet - 1) * 10)#" useragent="#CGI.http_user_agent#" result="THREAD.Get#intGet#" />

    </cfthread>

</cfloop>

<cfloop index="intGet" from="1" to="10" step="1">

    <cfthread action="join" name="objGet#intGet#" />
    <cfdump var="#Variables['objGet'&intGet]#"><br />

</cfloop>

et quand j'utilise après la jonction du fil à l'intérieur de la boucle.J'ai les résultats souhaités merci !!

Était-ce utile?

La solution

Deux problèmes se produisent ici.

Comme indiqué par Zugwalt, vous devez explicitement passer des variables que vous souhaitez référencer dans le cadre de votre fil.Il a manqué la variable CGI, cette portée n'existe pas dans votre fil.Nous passons donc à ce que nous devons utiliser dans le fil, userAgent, strabaseurl et intgege.

Deuxième problème, une fois joints, vos discussions ne sont pas en portée variable, elles sont dans la portée CFTHREAD, nous devons donc les lire de là.

Code corrigé:

<cfloop index="intGet" from="1" to="2" step="1">

    <!--- Start a new thread for this CFHttp call. Pass in user Agent, strBaseURL, and intGet --->
    <cfthread action="run" name="objGet#intGet#" userAgent="#cgi.http_user_agent#" intGet="#intGet#" strBaseURL="#strBaseURL#">

        <!--- Store the http request into the thread scope, so it will be visible after joining--->
        <cfhttp method="GET" url="#strBaseURL & ((intGet - 1) * 10)#" userAgent="#userAgent#" result="thread.get#intGet#"  />

    </cfthread>

</cfloop>

<cfloop index="intGet" from="1" to="2" step="1">

    <!--- Join each thread ---> 
    <cfthread action="join" name="objGet#intGet#" />
    <!--- Dump each named thread from the cfthread scope --->
    <cfdump var="#cfthread['objGet#intGet#']#" />

</cfloop>

Autres conseils

Généralement, les variables non définies sont placées dans le Variables scope, vous pouvez donc utiliser la notation struct bracket pour y faire référence :

Variables['objGet#intGet#']

ou

Variables['objGet'&intGet]

Ce sont tous les deux qui font fondamentalement la même chose – juste des syntaxes différentes.

Code exécuté à l'intérieur d'une balise CFThread a sa propre portée.Essayez de passer la variable que vous souhaitez accéder en tant qu'attribut.J'aime nommer quelque chose de différent juste pour m'aider à garder une piste.

<!--- Start a new thread for this CFHttp call. --->
<cfthread action="run" name="objGet#intGet#" intGetForThread="#intGet#">

    <cfhttp method="GET" url="#strBaseURL##((intGetForThread- 1) * 10)#" useragent="#CGI.http_user_agent#" result="THREAD.Get#intGetForThread#" />

</cfthread>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top