2

我正在调用使用 Angular 中的 REST 请求在后端生成 PDF 的进程(我正在使用 restangular 来创建这些)。

我的问题是我希望用户能够在此过程正常工作时继续工作,因为 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周围 - 这个来自here

    public function delay()
{
        ignore_user_abort(true);
        set_time_limit(0);
        ob_start();
        // do initial processing here
        echo 'Text the user will see';
        header('Connection: close');
        header('Content-Length: '.ob_get_length());
        ob_end_flush();
        ob_flush();
        flush();

        // Do processing here 
                    $d = time();            
                    sleep(5);
                    $t = time()-$d;            
        echo('Text user will never see');            
}

    public function runtime()
{
        $d = time();
        $t = time()-$d;            
        return $t;
}

实际上,发生的事情是 php 将响应发送回浏览器,然后继续进行应有的处理。但是,来自客户端的下一个请求仍然等待第一个请求完成处理后再运行。

我想要的行为是让 php 启动一个新线程,就好像我从另一个浏览器调用该方法一样(当然我已经测试过并且它有效)

4

1 回答 1

1

另一种选择是让服务器为正在进行的任何作业返回一个令牌,然后让客户端稍后发出第二个请求以使用超时检查作业的状态。然后,您的客户端代码可以在不主动轮询作业状态时继续启动新请求或执行其他工作。

这是一个非常简单的例子:

客户:

$.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);
}
于 2013-09-23T09:25:50.110 回答