我有来自api的json响应,我需要为每种产品循环并创建woocommerce产品或变体产品。
fontFamily
从上面的json可以看出,每页可能有很多页面,最多50个产品。我编写了第一页,就像上面的json示例,并在每个产品上循环。以下是我的代码
{
"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": []
}
]
}
我的问题是在for循环中设置了ajax请求。它在第一个ajax请求完成之前发送另一个ajax请求,并发送第三个ajax请求,即使第二个ajax尚未完成。
还有另一种方法可以做到这一点吗?但不同的是让第一个ajax在另一个第二个ajax被触发之前完成,然后在第二个请求完成之后还会触发第四个ajax请求,依此类推,直到没有产品离开了。
答案 0 :(得分: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);
}