const axios = require('axios');
const getShipmentDetails = ((nextCall) => {
const res = axios({
method: 'post',
url: nextCall,
headers:{ Authorization: "<Generated Bearer Token>"},
data:{
"filter" : {
"type" : "postDispatch",
"states" : ["SHIPPED"],
"orderDate" : {
"from" : "2022-04-01",
"to" : "2022-04-04"
}
}
}
})
if(res['data']['hasMore'] == false ){
return res['data']['shipments'].concat(getShipmentDetails(res['data']['nextPageUrl']))
}
else{return res['data']['shipments']}
});
const result = getShipmentDetails("https://api.flipkart.net/sellers/v3/shipments/filter/");
console.log(result);
我正在從分頁 API 中遞回獲取資料。在此代碼中添加等待/異步函式時出現多個錯誤。由于 API 呼叫的延遲輸出正在列印“未定義”。請使用 await/async 或任何合適的方法更新此代碼,以便連接所有頁面的資料。
uj5u.com熱心網友回復:
const axios = require('axios')
const getShipmentDetails = async ((url) => {
const res = await axios({
method: 'post',
url: url,
headers: { Authorization: "<Generated Bearer Token>"},
data: {
"filter" : {
"type" : "postDispatch",
"states" : ["SHIPPED"],
"orderDate" : {
"from" : "2022-04-01",
"to" : "2022-04-04"
}
}
}
})
if (res['data']['hasMore'] == true) {
const more = await getShipmentDetails(res['data']['nextPageUrl'])
return res['data']['shipments'].concat(more);
}
else {
return res['data']['shipments']
}
})
getShipmentDetails("https://api.flipkart.net/sellers/v3/shipments/filter/")
.then(result => console.log(result))
應該做你想做的。我假設你的hasMore條件倒退了,因為從邏輯上講,如果有額外的頁面,你會期望hasMore這是真的。
關于 async/await 和 Promise 的說明:
如果你使用 Promise,你必須一直使用 Promise。Javascript 不提供阻止承諾的機制。因此,如果您有異步代碼,那么您唯一的.then選擇async/await,是.then. 這與許多其他語言(包括 C# 和 Java)中的 Promises(或等價物)的作業方式不同。
最后是一些風格方面的事情:Javascript 常規風格總是if在條件運算式和括號之間放置一個空格,在條件運算式和塊開始之間放置一個空格。在物件鍵和它的值之間放置一個空格也是慣例。雖然分號和無分號都是常見的約定,但您應該保持一致,在任何地方都使用分號或不使用分號
uj5u.com熱心網友回復:
根據axios docs,該axios方法回傳一個 promise,因此您所要做的就是在適當的位置添加一些 async/await 陳述句:async在getShipmentDetails函式上,以及await何時呼叫它,以及awaiton axios。
const axios = require('axios');
const SHIPMENT_AXIOS_CONFIG = { // Pulled this out for readability
method: 'post',
headers: { Authorization: '<Generated Bearer Token>'},
data: {
filter: {
type: 'postDispatch',
states: ['SHIPPED'],
orderDate: {
from: '2022-04-01',
to: '2022-04-04',
}
}
}
};
const getShipmentDetails = async (nextCall) => {
const res = await axios({ // Wait for the response
...SHIPMENT_AXIOS_CONFIG,
url: nextCall,
});
const { data } = res; // destructuring to get common properties makes the code more readable
if (data.hasMore == false) { // Should this be hasMore === true?
// Wait for the additional details
const shipments = await getShipmentDetails(data.nextPageUrl);
return data.shipments.concat(shipments);
}
return data.shipments;
};
const result = await getShipmentDetails('https://api.flipkart.net/sellers/v3/shipments/filter/');
uj5u.com熱心網友回復:
也許更簡單的方法是使用 do-while 回圈,如下所示:
const axios = require('axios');
const callShipmentDetails = async (nextCall) => {
const res = await axios({...})
return res
}
const getShipmentDetails = (async (url = "https://api.flipkart.net/sellers/v3/shipments/filter/") => {
var hasMore = false
// var times = 0
do {
var response = await callShipmentDetails(url)
hasMore = response.data.hasMore
url = url.concat(response.data.nextPageUrl)
/*
this code is for breaking after 100 times if this becomes endless loop
*/
// times
// if (times > 100) break;
} while (hasMore)
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456168.html
標籤:javascript 节点.js 异步 异步等待 Flipkart-api
上一篇:我應該將此async/await和.exec與mongoose和google-auth-library一起使用嗎?
