2016-08-07 133 views
2

我有我的api這個json響應,我需要循環並創建woocommerce產品或變體產品,爲每個產品。完成第一個阿賈克斯之前發射第二,完成第二個阿賈克斯之前發射第三個阿賈克斯內循環

{ 
    "pagination": { 
    "page": 1, 
    "per_page": 50, 
    "results": 2, 
    "pages": 1, 
    "deleted_product": 0 
    }, 
    "products": [ 
    { 
     "id": "02dcd191-aebf-11e6-f485-5abe3e19de38aotbb94CZY3STcO1MxQS1S", 
     "name": "testProduct112312312312345325345", 
     "description": null, 
     "sku": "testProduct112312312312345325345", 
     "active": 1, 
     "cost_price": 0, 
     "list_price": null, 
     "sell_price": 17.28, 
     "tax_value": 1.728, 
     "tax_name": "Sales_tax_sample", 
     "tax_rate": 0.1, 
     "tax_id": "02dcd191-aebf-11e6-f485-1c85a7f11c83", 
     "includes_tax": true, 
     "quantity": null, 
     "product_type": null, 
     "update_at": "2016-08-05 03:42:14", 
     "deleted_at": null, 
     "images": [], 
     "variants": [], 
     "tags": [], 
     "outlets": [ 
     { 
      "outlet_id": "0a422413-2fb9-11e6-ff63-0b90c839fa9e", 
      "name": "Main Outlet", 
      "quantity": 10 
     } 
     ], 
     "price_books": [ 
     { 
      "id": "65f85250-5ce8-9295-59be-40d76716eb00", 
      "price": 17.28 
     } 
     ], 
     "brands": [] 
    }, 
    { 
     "id": "02dcd191-aebf-11e6-f485-5abe44095b97aotbb94CZY3STcO1MxQS1S", 
     "name": "var1444444444444444444444444444444444444444444", 
     "description": "<p>jameshwart</p>", 
     "sku": "testvar_23234", 
     "active": 1, 
     "cost_price": 0, 
     "list_price": null, 
     "sell_price": 7.49545, 
     "tax_value": 0.74955, 
     "tax_name": "Sales_tax_sample", 
     "tax_rate": 0.1, 
     "tax_id": "02dcd191-aebf-11e6-f485-1c85a7f11c83", 
     "includes_tax": true, 
     "quantity": null, 
     "product_type": null, 
     "update_at": "2016-08-05 05:55:55", 
     "deleted_at": null, 
     "images": [], 
     "variants": [ 
     { 
      "id": "02dcd191-aebf-11e6-f485-5abe44095b97aotbb94CZY3STcO1MxQS1S", 
      "name": "var1444444444444444444444444444444444444444444/Blue", 
      "sku": "10017", 
      "quantity": null, 
      "tax_value": 0.74955, 
      "tax_name": "Sales_tax_sample", 
      "tax_rate": 0.1, 
      "tax_id": "02dcd191-aebf-11e6-f485-1c85a7f11c83", 
      "includes_tax": true, 
      "list_price": null, 
      "sell_price": 7.49545, 
      "cost_price": 0, 
      "option_one_name": "Colour", 
      "option_one_value": "Blue", 
      "option_two_name": null, 
      "option_two_value": null, 
      "option_three_name": null, 
      "option_three_value": null, 
      "update_at": "2016-08-05 05:55:55", 
      "deleted_at": null, 
      "outlets": [ 
      { 
       "outlet_id": "0a422413-2fb9-11e6-ff63-0b90c839fa9e", 
       "name": "Main Outlet", 
       "quantity": 0 
      } 
      ], 
      "price_books": [ 
      { 
       "id": "b343e66b-33d1-41af-9969-9df911a29b7baotbb94CZY3STcO1MxQS1S", 
       "price": 7.49545 
      } 
      ] 
     }, 
     { 
      "id": "02dcd191-aebf-11e6-f485-5abe45693e6caotbb94CZY3STcO1MxQS1S", 
      "name": "var1444444444444444444444444444444444444444444/Red", 
      "sku": "sku_119", 
      "quantity": null, 
      "tax_value": 0.99773, 
      "tax_name": "Sales_tax_sample", 
      "tax_rate": 0.1, 
      "tax_id": "02dcd191-aebf-11e6-f485-1c85a7f11c83", 
      "includes_tax": true, 
      "list_price": null, 
      "sell_price": 9.97727, 
      "cost_price": 0, 
      "option_one_name": "Colour", 
      "option_one_value": "Red", 
      "option_two_name": null, 
      "option_two_value": null, 
      "option_three_name": null, 
      "option_three_value": null, 
      "update_at": "2016-08-05 05:55:55", 
      "deleted_at": null, 
      "outlets": [ 
      { 
       "outlet_id": "0a422413-2fb9-11e6-ff63-0b90c839fa9e", 
       "name": "Main Outlet", 
       "quantity": 0 
      } 
      ], 
      "price_books": [ 
      { 
       "id": "fdd0f01b-a2c2-0263-b17c-3f63fdf0e6b8", 
       "price": 9.97727 
      } 
      ] 
     } 
     ], 
     "tags": [], 
     "outlets": [ 
     { 
      "outlet_id": "0a422413-2fb9-11e6-ff63-0b90c839fa9e", 
      "name": "Main Outlet", 
      "quantity": 0 
     } 
     ], 
     "price_books": [ 
     { 
      "id": "b343e66b-33d1-41af-9969-9df911a29b7baotbb94CZY3STcO1MxQS1S", 
      "price": 7.49545 
     } 
     ], 
     "brands": [] 
    } 
    ] 
} 

你可以從JSON見上面可能有許多可能的頁數和每頁最多50種產品。我已經編碼得到上面的例子json的第一頁,並循環每個產品。以下是我的代碼

function product_to_woo(page){ 

      //check if page is undefined then we set it to one 
      if(typeof page == 'undefined'){ 
       page = 1; 
      }else if(page <= 0){ 
       //Make sure we always start to page 1 
       page = 1; 
      } 
      var product_number = 0; 

      get_product_by_page(page, function(res){ 
       var product_count = res.products.length; 

       if(product_count > 0){ 

        for(var i = 0; i < product_count; i++){ 


         product = res.products[i]; 
         if(product.deleted_at == null){ 
          product_number = i+1; 
         } 


         if(res.pagination.page > 1){ 
          product_number += PER_PAGE;//PER_PAGE is constant value 50 
         } 

         var p_data = { 
          action    : 'import_to_woo', 
          page    : res.pagination.page, 
          product_total_count : res.pagination.results, 
          product    : product, 
          product_number  : product_number, 
          deleted_product  : res.pagination.deleted_product 
         }; 

         post_data(p_data,function(p_res){ 
          //I have done some message for the users 
         }); 
        } 

       } 



       if(res.pagination.page <= res.pagination.pages){ 

        page = parseInt(res.pagination.page) + 1; 

        if(page <= res.pagination.pages){ 
         product_to_woo(page); 
        } 

       } 

      }); 

    } 

我的問題是在循環內設置ajax請求。它在第一個ajax請求完成之前發送另一個ajax請求,併發送第三個ajax請求,即使第二個ajax尚未完成。

是否有另一種方式來做到這一點?,但不同的是讓第一個ajax在另一個第二個ajax被觸發之前完成,然後在第二個請求完成之後還會觸發第四個ajax請求,依此類推,直到有沒有產品離開。

回答

3

你可以在第一個ajax的successCallback裏運行你的第二個ajax。然後在第一個ajax的successCallback裏面運行你的第三個ajax。等等等等。

//first ajax 
$.post("someurl.php", { data: someData }, function (response1) { 
    //do work with the response of the ajax 
    //... 

    //second ajax 
    $.post("someotherurl.php", { data: someOtherData }, function (response2) { 
     //... 

     //third ajax 
     $.post("yetanotherurl.php", { data: yetAnotherData }, function (response3) { 
      //... 
     }); 
    }); 
}); 

一種更好的方式管理這個回調地獄將使用deferred喜歡的jqXhr對象的行爲。


在特定情況下,你是一個循環內併發Ajax調用。假設你不知道確切的呼叫次數,上面提到的方法最多不適用或者非常麻煩。但是您可以使用jQuery.Deferred()jQuery.when()以確保在運行ajax之前,所有以前的ajax調用和所有相關的工作已經完成。

var defs = []; 
for (var i = 0; i < 3; i++) { 
    var d = $.Deferred(); 

    //make sure to wait for all the previous ajax calls to get resolved 
    $.when.apply(this, defs).done(function() { 
     $.post("url", { data: someData }, function (response) { 
      //do work with response 
      //... 

      d.resolve(); //resolve the deferred to let the next ajax know it is done 
     }); 
    }); 

    defs.push(d); 
}