2017-09-26 368 views
-1

沒有真正期望得到答案,但現在有了這個2天掙扎,不知道怎麼回事。瀏覽器掛起(等待響應?)

所以在這裏我做了什麼:

通過AJAX,並立即開始在後端處理它上傳文件。

$.ajax({ 
    type : "post", 
    cache: false, 
    contentType: false, 
    processData: false, 
    url : formAction, 
    data : formData 
}); 

在後臺我寫會話存儲在那裏像10000 500目前的進展...

然後,我調用另一個AJAX從會話檢查狀態,我呼籲這個funcion每1秒鐘,直到responsve回報「完成」。

看上去對我來說合法,但問題是,在後端處理完成後,第一個XHR將狀態從'pending'更改爲200個瀏覽器凍結,看起來像是阻止它,像另一個請求或somehing。 chekc屏幕波紋管。

starting to process imported file

所以它的完成,檢查停止,狀態更改爲200,沒有發生,但瀏覽器凍結,試圖瀏覽器,火狐瀏覽器...暗示我殺的過程,但如果我等待一段時間它將刷新。

Done

UPDATE

所以,我騙了一點點,我試圖再做一次相同,但沒有Ajax,看到類似的問題,後端處理完成後,瀏覽器應答等待(向後旋轉)以後。這就是表哥掛什麼。

這裏是我的後端是Laravel

foreach ($chunks as $rows) 
     { 
      $current_chunk++; 

      if ($current_chunk < $all_chunks) { 
       Session::put(['import_progress'=>'Importing ' . $current_chunk * 150 . ' of ' . $all_results]); 
       Session::save(); 
      } elseif ($current_chunk >= $all_chunks) { 
       Session::put(['import_progress'=>'done']); 
      } 

      foreach ($rows as $row) 
      { 
       // transakcija start 
       DB::transaction(function() use ($row) { 

        $code = $row[0]; 
        $gender = $row[1]; 
        $brand_name = filter_var($row[2],FILTER_SANITIZE_STRING); 
        $category = $row[3]; 
        $subcategory = $row[4]; 
        $condition = $row[5]; 
        $details = $row[6]; 
        $composition = $row[7]; 
        $materials = $row[8]; 
        $colors = $row[9]; 
        $patterns = $row[10]; 
        $country = $row[11]; 
        $size = $row[12]; 
        $m_a = $row[13]; 
        $m_b = $row[14]; 
        $m_c = $row[15]; 
        $m_d = $row[16]; 
        $m_e = $row[17]; 
        $m_f = $row[18]; 
        $m_g = $row[19]; 

        $product = new Product(); 
        $product->code = $code; 
        $product->gender = $gender; 
        $product->size = $country . ' | ' . $size; 
        $product->condition = $condition; 
        $product->measurement_a = $m_a; 
        $product->measurement_b = $m_b; 
        $product->measurement_c = $m_c; 
        $product->measurement_d = $m_d; 
        $product->measurement_e = $m_e; 
        $product->measurement_f = $m_f; 
        $product->measurement_g = $m_g; 
        $product->save(); 

        if (empty($code)) { 
         $bad_prods[] = $product->id; 
        } 

        if (!empty($brand_name)) { 
         $brand = Brand::firstOrCreate(['brand_name'=>$brand_name]); 
         $product_b = new ProductBrand(); 
         $product_b->brand_id = $brand->id; 
         $product_b->product_id = $product->id; 
         $product_b->save(); 
        } 

        if (!empty($materials)) { 
         $materials_exp = explode(',',$materials); 

         foreach ($materials_exp as $material) { 
          $material = Material::firstOrCreate(['material_name'=>trim($material)]); 
          $product_m = new ProductMaterial(); 
          $product_m->material_id = $material->id; 
          $product_m->product_id = $product->id; 
          $product_m->save(); 
         } 
        } 

        if (!empty($patterns)) { 
         $patterns_exp = explode('/',$patterns); 
         foreach ($patterns_exp as $pattern) { 
          $pattern = Pattern::firstOrCreate(['pattern_name'=>trim($pattern)]); 
          $product_p = new ProductPattern(); 
          $product_p->pattern_id = $pattern->id; 
          $product_p->product_id = $product->id; 
          $product_p->save(); 
         } 
        } 

        if (!empty($colors)) { 
         $colors_exp = explode('/',$colors); 
         foreach ($colors_exp as $color) { 
          $color = Color::firstOrCreate(['color_name'=>trim($color)]); 
          $product_c = new ProductColor(); 
          $product_c->color_id = $color->id; 
          $product_c->product_id = $product->id; 
          $product_c->save(); 
         } 
        } 

        $product_t = new ProductTranslation(); 
        $product_t->product_id = $product->id; 
        $product_t->product_title = $brand_name; 
        $product_t->product_description = '<p>'.$details.'</p><p>'.$composition.'</p>'; 
        $product_t->save(); 

       }); // end transakcija 
      } 
     } 

     Session::put(['import_progress'=>'done']); 
     Session::put(['bad_prods'=>$bad_prods]); 

     return redirect()->route('admin.import'); 

在這裏,我檢查狀態

public function status() 
    { 
     return response()->json([ 
      'status' => Session::get('import_progress'), 
      'bad_prods' => Session::get('bad_prods') 
     ]); 
    } 
+0

有**的setTimeout()** **或setInterval的()**隨時隨地在代碼的其他人呢? 在定期的時間間隔後發佈你正在調用該功能的部分。 –

+0

我也有,但沒有檢查狀態相同的情況發生,所以它不是一個問題... – RomkaLTU

+0

後,你都令人耳目一新的片段/檢查狀態 –

回答

0

當處理完成後,我把簡單的exit();在處理控制器結束時...不知道爲什麼這個工作原理和其他任何return語句都沒有。