Что не так с моим рекурсивным вызовом метода? - PullRequest
0 голосов
/ 13 января 2011

У меня есть функция поиска, которая выполняет хранимую процедуру и возвращает результаты. Если результатов нет, я хочу попробовать запустить функцию еще раз с более обобщенным поиском. Итак, я вставил в свой код cfif -

<cfif results.recordCount EQ 0 And Not arguments.searchForPotentialMatches>
   <cfset arguments.searchForPotentialMatches = True />
   <cfinvoke method="thisMethod" argumentCollection="#arguments#" />
</cfif>

В основном, если результатов не было И я еще не пробовал обобщенный поиск, он должен снова вызвать этот метод. Затем, в начале метода, перед вызовом хранимой процедуры я проверяю, истинно ли searchForPotentialMatches, и если да, я обобщаю поисковый запрос.

Кажется, есть проблема, хотя ... Когда я пытаюсь запустить это, он зависает - пока не истечет время ожидания с хранимой процедурой. Благодаря отладке и выводу переменных я смог увидеть, что он попадает в хранимую процедуру, а затем застревает, пытаясь ее выполнить. Тем не менее, используя исходную функцию перед этими изменениями, если я выполняю обычный поиск, а затем обобщенный поиск в двух отдельных вызовах, он выполняется правильно. Так что я не уверен, почему это не удается, когда я пытаюсь встроить это программно ... Что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 13 января 2011

На самом деле может быть любое количество вещей.Весь этот код внутри cfc?Является ли это cfc в постоянной области и правильно ли вы изменили все свои переменные?

Можете ли вы выполнить сохраненный процесс как в обычных, так и в обобщенных условиях автономно без проблем?

Попробуйте вставить большевашего кода (включая первый вызов хранимой процедуры), чтобы мы могли попытаться отследить ваш поток данных немного больше.

1 голос
/ 13 января 2011

Рекурсия это:

  • соблазнительно просто в теории и боль в заднице на практике - отлаживать.
  • часто необходимо ходить по деревьям или обходить графики, но когда можно обойтись без, обходиться без.

Итак, как вы написали, я бы потерял рекурсию и сделал бы ее последовательно.Если бы больше не было кода, запрошенного @scrittler, я бы переписал его так:

<cfcomponent output="false">
    <cffunction name="search" output="false" access="public" returntype="any" hint="I am called by the client">
        <!--- <cfargument/> tags --->
        <!--- what ever you need to do with the arg before actually searching --->
        <cfset var results = doSearch(argumentCollection=arguments)>
        <cfif NOT results.recordcount>
            <!--- whatever you need to change about the args to perform a generalized search --->
            <cfset var results = doSearch(argumentCollection=arguments)>
        </cfif>

        <cfreturn results>
    </cffunction>

    <cffunction name="doSearch" output="false" access="private" returntype="query" hint="I run the query">
        <!--- <cfargument/> tags --->
        <!--- results query (i.e. call to sproc)--->
        <cfreturn results>
    </cffunction>
</cfcomponent>
0 голосов
/ 25 января 2011

Это кажется несправедливым ... Но проблема была с чем-то совершенно другим.Рекурсивный вызов работает правильно, но было другое поле, которое было изменено из-за проверки в функции перед вызовом хранимой процедуры и вызыванием зависания хранимого процесса.Извините за это, и спасибо за вашу помощь!

0 голосов
/ 14 января 2011

Каков ваш атрибут доступа в теге функции, вы дали ему значение, которое оставляет функцию неспособной вызывать себя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...