我不知道这是怎么回事。它似乎是某种时序/异步问题。我有一个axios POST,它具有链接的.then,然后使用axios GET请求运行另一个功能。 GET请求具有链接的.then,该链接建立了一个名为itemInformation的对象并返回该对象。 POST上的第一个.then具有第二个.then链,需要处理itemInformation对象。
很抱歉,如果这一切令人困惑,则希望代码能使它更有意义。我正在控制台同时在两个地方记录该对象,而控制台日志却比我期望的要向后出现。所以这就是为什么我认为这里可能是某种异步或时序问题。
代码:(首先调用addToCartVue)
addToCartVue(itemData) {
let vm = this;
vm.buildDataString(itemData); // just a simple function that creates the dataString, dataObject and quantity vars; no need to show this whole function
return axios.post(POST_ENDPOINT, {
data: vm.dataString
},
{
headers: {
"Content-Type": "application/x-www-form-urlencoded"
}
}).then(response => {
vm.updateCartInfo(vm.dataObject, itemData.addToCartParameters.itemId, vm.selectedStoreId, vm.quantity);
}).then(response => {
console.log("info2: ", response);
if (itemData.addToCartParameters.showLB) {
vm.emitGlobalEvent('addToCart::open', response);
return (response);
}
}).catch(err => console.log(err));
},
updateCartInfo(dataObject, itemId, selectedStore, quantity) {
return axios.get(GET_ENDPOINT, {
params: dataObject,
}).then(response => {
let addedItem = null;
let basketInfo = null;
let productQuantity = null;
try {
cartDropDown.populateCartDropDown(response.data);
addedItem = response.data.addedItem;
basketInfo = response.data.basketInfo;
productQuantity = quantity;
if (addedItem.quantity > -1) {
productQuantity = addedItem.quantity;
}
} catch (e) {
console.log(e);
}
const itemInformation = {
"itemId": itemId,
"selectedStore": selectedStore,
"addedItem": addedItem,
"basketInfo": basketInfo,
"displayValues": null,
"quantity": productQuantity,
"isCustomProduct": false
};
console.log("info1: ", itemInformation);
return itemInformation;
}).catch(error => console.log(error));
}
我在网上找到的每个Axios教程都展示了如何进行基本的axios.get(url).then(get response).catch(catch error)
,但在更复杂的用例中却找不到任何示例。
答案 0 :(得分:1)
response
值不通过多个链链接。您有以下代码:
// ...
}).then(response => {
vm.updateCartInfo(vm.dataObject, itemData.addToCartParameters.itemId, vm.selectedStoreId, vm.quantity);
}).then(response => {
console.log("info2: ", response);
if (itemData.addToCartParameters.showLB) {
vm.emitGlobalEvent('addToCart::open', response);
return (response);
}
}) // ...
您有两个then
链链接。在第一个中,定义了response
,如您在控制台日志中所见。 您需要返回它,以便将其传递到第二个链接。如果then
函数没有return
值,那么下一个承诺链then
将收到undefined
,如您所见。
对于console
日志的顺序,Promise始终会解决异步问题。因此,由于在updateCartInfo
中您正在执行axios.get(GET_ENDPOINT, ...).then( ... console.log() ... )
,因此它正在异步等待axios.get
。在这段时间内,另一个then
(“ info2”)被执行。它不会等待updateCartInfo
的诺言,因为您没有返回它。