Javascript 允许对php的进一步ajax请求,同时继续处理第一个请求
我正在调用一个进程,以便在后端使用Angular中的REST请求生成PDF(我正在使用restangular创建这些PDF) 我的问题是,我希望用户能够继续工作,而这个过程是工作的pdf生成可能需要一段时间。作为测试,我创建了一个服务,在将数据返回到客户端之前有5秒的延迟。我这样称呼它:Javascript 允许对php的进一步ajax请求,同时继续处理第一个请求,javascript,php,ajax,rest,restangular,Javascript,Php,Ajax,Rest,Restangular,我正在调用一个进程,以便在后端使用Angular中的REST请求生成PDF(我正在使用restangular创建这些PDF) 我的问题是,我希望用户能够继续工作,而这个过程是工作的pdf生成可能需要一段时间。作为测试,我创建了一个服务,在将数据返回到客户端之前有5秒的延迟。我这样称呼它: var d = $q.defer(); Restangular .all('delay') .getList()
var d = $q.defer();
Restangular
.all('delay')
.getList()
.then(function (data) {
d.resolve(data);
}, function () {
d.reject();
});
return d.promise;
这很好,但我在通话结束前提出的任何其他请求都会被阻止。如果我链接了.then函数,我希望会发生这种情况,但我调用的是一个完全独立的REST请求
我必须等待生成PDF的服务完成,然后再返回到客户端,否则该过程将无法完成。那么我必须等待还是可以同时运行两个或多个REST请求
谢谢
编辑。。。。
似乎没有人对这个问题感兴趣!无论如何,我一直在研究从php返回一个请求的选项,以允许javascript继续运行,而这种方法是可行的。有几个版本的答案散布在stackoverflow周围-这一个来自
实际上,所发生的事情是,php将响应发送回浏览器,然后继续进行它应该进行的处理。但是,来自客户端的下一个请求在运行之前仍然等待第一个请求完成处理
我想要的行为是php启动一个新线程,就像我从另一个浏览器调用该方法一样(当然,我已经测试过了,它可以工作)另一个选项是让服务器为正在处理的任何作业返回一个令牌,然后让客户端稍后发出第二个请求,使用超时检查作业的状态。然后,当不主动轮询作业状态时,客户端代码可以继续启动新请求或执行其他工作 下面是一个非常简单的例子: 客户端:
$.ajax({
url: "startJob",
success: function(response) {
setTimeout(function(){ pollForJobStatus(response.jobToken) },3000);
}
});
function pollForJobStatus(jobToken) {
$.ajax({
url: "jobStatus",
success: function(response) {
if(response.job.status == 'done') {
// DO SOMETHING WITH THE RESULTS
}
else {
//keep polling
setTimeout(function(){ pollForJobStatus(response.jobToken) },3000);
}
}
});
}
*// POST: '/startJob'*
function($data)
{
// take incoming data from client,
//start 'job' on a new thread
$job = new PdfJob($data);
$job->start();
//record the threadID info in database
DB.store($job->processId, $job->jobToken);
//return token to client
return new ApiResponse($job->jobToken);
}
*// GET: '/jobStatus'*
function($token)
{
// lookup job's process id in the db
$pId = DB.retrieve($token);
// use the processId to check the job status
$jobStatus = checkJobStatus($pId);
//return status to client
return new ApiResponse($jobStatus);
}
服务器:
$.ajax({
url: "startJob",
success: function(response) {
setTimeout(function(){ pollForJobStatus(response.jobToken) },3000);
}
});
function pollForJobStatus(jobToken) {
$.ajax({
url: "jobStatus",
success: function(response) {
if(response.job.status == 'done') {
// DO SOMETHING WITH THE RESULTS
}
else {
//keep polling
setTimeout(function(){ pollForJobStatus(response.jobToken) },3000);
}
}
});
}
*// POST: '/startJob'*
function($data)
{
// take incoming data from client,
//start 'job' on a new thread
$job = new PdfJob($data);
$job->start();
//record the threadID info in database
DB.store($job->processId, $job->jobToken);
//return token to client
return new ApiResponse($job->jobToken);
}
*// GET: '/jobStatus'*
function($token)
{
// lookup job's process id in the db
$pId = DB.retrieve($token);
// use the processId to check the job status
$jobStatus = checkJobStatus($pId);
//return status to client
return new ApiResponse($jobStatus);
}
谢谢我要试一试。