2015-03-25 14 views
1

我正在實現一個表單,它要求一個帶有ajax的進程來同步2個數據庫,我需要等到該進程完成。等待使用yii2表單的Ajax響應

在我的表單中我有流動代碼發送數據庫憑據:

<div class="col-lg-offset-1 col-lg-11"> 
<?= 
Html::a('Sync Databases', ['runsync'], [ 
    'class' => 'btn btn-primary', 
    'id' => 'ajax_link_02', 
    'data-on-done' => 'linkFormDone', 
    'data-form-id' => 'syncdb_form',] 
) 
?>   

,我也與阿賈克斯

function handleAjaxLink(e) { 
    e.preventDefault(); 
    var 
     $link = $(e.target), 
     callUrl = $link.attr('href'), 
     formId = $link.data('formId'), 
     onDone = $link.data('onDone'), 
     onFail = $link.data('onFail'), 
     onAlways = $link.data('onAlways'), 
     ajaxRequest; 

     $("#show_msg").html("Loading.... please wait..."); 

     ajaxRequest = $.ajax({ 
     type: "post", 
     dataType: 'json', 
     url: callUrl, 
     data: (typeof formId === "string" ? $('#' + formId).serializeArray() : null) 
    }); 

    // Assign done handler 
    if (typeof onDone === "string" && ajaxCallbacks.hasOwnProperty(onDone)) { 
     ajaxRequest.done(ajaxCallbacks[onDone]); 
    } 

    // Assign fail handler 
    if (typeof onFail === "string" && ajaxCallbacks.hasOwnProperty(onFail)) { 
     ajaxRequest.fail(ajaxCallbacks[onFail]); 
    } 

    // Assign always handler 
    if (typeof onAlways === "string" && ajaxCallbacks.hasOwnProperty(onAlways)) { 
      ajaxRequest.always(ajaxCallbacks[onAlways]); 
     } 

    } 

var ajaxCallbacks = { 
     'linkFormDone': function (response) { 
      $('#show_msg').html(response.body); 
     } 

    } 

AJAX調用工作正常註冊的js並致電控制器:

public function actionRunsync() { 
    if (Yii::$app->request->isAjax) { 
     \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
     $model = new \app\modules\admin\models\syncdb(); 
     $response = $model->runSyncDb($_POST); 
     $res = array(
      'body' => $response, 
      'success' => true, 
     ); 

     return $res; 
    } 
} 

但不等待的過程

$model->runSyncDb($_POST) 

完成。如果我評論這個過程並添加一個文本,它可以正常工作,但如果過程需要很長時間,則不會。

我在做什麼錯?

回答

0

我只是增加了異步假Ajax請求:

   async: false, 

所以現在的Ajax是這樣的:

ajaxRequest = $.ajax({ 
     type: "post", 
     async: false, 
     dataType: 'json', 
     url: callUrl, 
     data: (typeof formId === "string" ? $('#' + formId).serializeArray() : null) 
    }); 

不知道的最好的方式,但完美的作品...