我有一個用例,我必須呼叫$http.post(request)批量輸入資料。為此,我創建了一個請求陣列。對于它們中的每一個,我需要獲取 的回應$http.post(),將其附加到現有陣列并將其傳遞給渲染函式。只有在前一個呼叫完成時才必須進行下一個呼叫,并且由于$http.post()回傳了一個承諾(根據 this),我正在嘗試使用該reduce函式來執行此操作。
function callToHttpPost(request) {
return $http.post('someurl', request);
}
function outerFunc($scope, someId) {
let completeArray = [];
let arrayOfRequests = getRequestInBatches();
arrayOfRequests.reduce((promiseChain, currentRequest) => {
console.log(promiseChain);
return promiseChain.then((previousResponse) => {
completeArray.push.apply(completeArray, previousResponse.data);
render($scope, completeArray, someId);
return callToHttpPost(currentRequest);
});
}, Promise.resolve()).catch(e => errorHandler($scope, e, someId));
}
(我已經提到了MDN和這個答案)
但這給了我TypeError: previousResponse is undefined。log 陳述句顯示第一個 promise 已解決(因為它是傳遞給reduce函式的初始值),但rejected由于此錯誤,其他 promise 顯示為已解決。我該如何解決這個問題?
uj5u.com熱心網友回復:
如果該outerFunc函式可以在async背景關系中使用(看起來可以,因為它什么都不回傳,并且結果render在構建時傳遞給函式),您可以直接清理它,將其精簡為:
async function outerFunc($scope, someId) {
const completeArray = [];
try {
for (const request of getRequestInBatches()) {
const { data } = await callToHttpPost(request);
completeArray.push(...data);
render($scope, completeArray, someId);
}
} catch (e) {
errorHandler($scope, e, someId)
}
}
順序性質將由async/await關鍵字強制執行。
uj5u.com熱心網友回復:
錯誤在于傳遞初始值。在 reduce 函式的第一次迭代中,Promise.resolve()回傳undefined。這就是作為previousResponse. 傳遞Promise.resolve({ data: [] })作為initialValue對減少功能解決了這個問題。
arrayOfRequests.reduce((promiseChain, currentRequest) => {
console.log(promiseChain);
return promiseChain.then((previousResponse) => {
completeArray.push.apply(completeArray, previousResponse.data);
render($scope, completeArray, someId);
return callToHttpPost(currentRequest);
});
}, Promise.resolve({ data: [] })).catch(e => errorHandler($scope, e, someId));
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345320.html
