【发布时间】:2017-02-28 12:50:47
【问题描述】:
经过几天的研究和测试,我决定发布这个信息请求作为最后的手段:-)
我想做的很简单,但是尽管我可以做所有的测试......我做不到:-(
使用 symfony Framework v2.8,我想在控制器的操作执行期间以及当用户单击按钮时为进度条引导程序设置动画。
我使用的原理是
- 在执行处理操作期间更新 SESSION 变量
- 另一个操作读取此 SESSION 变量
当用户点击按钮时:
- 使用 AJAX 我执行我的处理操作
- 使用 AJAX,只要我的处理操作未完成,我就会执行读取 SESSION 变量的操作。
简而言之,没有什么很复杂的:-)
我面临的问题是我的 SESSION 变量读取操作在我的处理操作执行期间没有执行。在我行动之前
治疗是,是之后,但在...期间不!
-> 在处理过程中我无法读取 SESSION 的变量,因此无法为进度条设置动画。
这里是JS代码:
$('#generator').click(function() {
var isInProgress = false;
traitement();
function traitement()
{
isInProgress = true;
checkProgress();
$.ajax({
type: "GET",
url: '{{ path('sws_back_createplanning', { 'idChampionnat': Championnat.id })}}',
async : true,
cache: false,
dataType:'html',
success: function(data){},
error: function(){ },
complete: function(){
isInProgress = false;
}
});
}
function checkProgress()
{
if( isInProgress != false )
{
$.ajax({
type: "GET",
url: 'championnat/getprogress/',
async : true,
cache: false,
dataType:'html',
success: function(data){
/* animation de la progress bar */
},
error: function(){ },
complete: function(){
checkProgress();
}
});
} else { }
}
})
这里是处理动作代码:
public function traitementAction($id){
$session = new Session();
$session->set('progress', 0);
// traitement #1
$session->set('progress', 25);
// traitement #2
$session->set('progress', 50);
// traitement #3
$session->set('progress', 75);
// traitement #4
$session->set('progress', 100);
return new Response ("Traitement terminé");
}
这里是SESSION变量的读取动作代码:
public function getProgressAction(Request $request)
{
$percent = $this->get('session')->get('progress');
if ($percent == 100){
$session = new Session();
$session->remove('progress');
}
return new Response($percent);
}
在我的测试中,我还将我的操作转换为“命令”,并使用 Process 组件执行了这个“命令”。
- 使用 RUN () 方法,检测到与我的控制器操作相同的行为
- 使用 START(异步执行)方法,“命令”的执行在执行“命令”的控制器的动作结束时停止 -> 由于过程的概念
父母/孩子。这意味着,如果我理解正确的话,一旦父进程(控制器操作的执行)结束,启动该进程的子进程就会结束
"COMMAND" -> 子进程无法在其父进程中存活。
这是启动“命令”的控制器动作的代码:
public function commandAction($id)
{
$commandline = "php console app:generate-planning ".$idChampionnat;
$process = new Process($commandline);
$dossier = $this->get('kernel')->getRootDir() . DIRECTORY_SEPARATOR;
$process->setWorkingDirectory($dossier);
$process->start(); // https://github.com/symfony/symfony/issues/20513
$process->wait(); // Pour ne pas que l'exécution de la commande ne soit 'Killée' ... mais empêche la lecture de la variable de SESSION tant que la commande n'est pas terminée
return new Response ("Commande démarrée");
}
所以总结一下我的问题,我不能同时执行我的两个查询。我当然要错过一些东西……你能帮帮我吗?
最好的问候
【问题讨论】:
标签: ajax symfony progress-bar