Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 允许对php的进一步ajax请求,同时继续处理第一个请求_Javascript_Php_Ajax_Rest_Restangular - Fatal编程技术网

Javascript 允许对php的进一步ajax请求,同时继续处理第一个请求

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()

我正在调用一个进程,以便在后端使用Angular中的REST请求生成PDF(我正在使用restangular创建这些PDF)

我的问题是,我希望用户能够继续工作,而这个过程是工作的pdf生成可能需要一段时间。作为测试,我创建了一个服务,在将数据返回到客户端之前有5秒的延迟。我这样称呼它:

        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);
}

谢谢我要试一试。