我認為 for 回圈在 Javascript 中被阻塞,但是這個函式在 for 回圈完成之前回傳一個空陣列。這個問題的答案是用 for 回圈作為一個承諾來設定一個新函式嗎?如果是這樣,那看起來像什么,promise 的語法讓我很困惑。
async function retrieve_s3_file(to_do_list, guid){
var data_list = [];
for (let i = 0; i < to_do_list.length; i )
{
element = to_do_list[i];
console.log("\n\nOutgoing request /jobs/list?guid=" guid "&file=" element);
axios.get(job_queue_url "?guid=" guid "&file=" element)
.then(function (res){
data_list.push(res.data);
console.log("Inside Loop: " JSON.stringify(data_list));
})
.catch(function (error){
console.log(error);
});
}
console.log("Data List: " JSON.stringify(data_list));
return JSON.stringify(data_list);
}
uj5u.com熱心網友回復:
Javascript 是單執行緒的,因此回圈通常是阻塞的,但在這種情況下,您的承諾會將它的新任務放在堆疊的末尾。如果您使用 await ,則不應創建新任務,并且它應該按照您的意愿行事。但是你正在使它成為sycronus,所以它會比以前慢一點。
async function retrieve_s3_file(to_do_list, guid){
var data_list = [];
for (let i = 0; i < to_do_list.length; i )
{
element = to_do_list[i];
console.log("\n\nOutgoing request /jobs/list?guid=" guid "&file=" element);
await axios.get(job_queue_url "?guid=" guid "&file=" element)
.then(function (res){
data_list.push(res.data);
console.log("Inside Loop: " JSON.stringify(data_list));
})
.catch(function (error){
console.log(error);
});
}
console.log("Data List: " JSON.stringify(data_list));
return JSON.stringify(data_list);
}
uj5u.com熱心網友回復:
axios.get是一個承諾。在 javascript 中,promise 是非阻塞的,這意味著then函式中給出的回呼將在 promise 解決后運行。但是承諾不會阻塞執行緒。
下面的例子反映了問題的問題。start end然后控制臺列印ok。因為customPromise是一個 promise 并且在沒有 的情況下被呼叫await,所以呼叫者不會等待該 promise 完成,所以呼叫者將繼續執行并列印end。請注意,此承諾會立即解決,但回呼res => console.log(res)將在最后執行,因為它是一個承諾回呼。
const customPromise = new Promise((resolve, reject)=>{resolve('ok')})
function nonBLockingExample (){
console.log('start');
customPromise.then(res => console.log(res));
console.log('end');
}
nonBLockingExample();
以下是所需輸出的示例。呼叫者等待customPromise解決,因為使用customPromise關鍵字呼叫await。
const nonBlockingPromise = new Promise((resolve, reject)=>{resolve('ok')})
async function bLockingExample (){
console.log('start');
await nonBlockingPromise.then(res => console.log(res));
console.log('end');
}
bLockingExample();
因此,要將修復應用于您的代碼,只需 await axios.get。( await axios.get(.....)
uj5u.com熱心網友回復:
如果您使用異步操作,它不會阻塞。
await如果您希望 Axios 在請求結束之前等待,您可以使用關鍵字,否則使用承諾。收集它們并使用Promise.all您可以在解決所有請求后將所有回應作為陣列獲取。
async function retrieve_s3_file(to_do_list, guid) {
const requests = [];
for (const file of to_do_list) {
const params = new URLSearchParams({ guid, file });
const request = axios.get(`${job_queue_url}?${params.toString()}`);
requests.push(request.then((response) => response.data));
}
return Promise.all(requests).then(JSON.stringify);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461784.html
標籤:javascript 节点.js 承诺
上一篇:這個歷史資料是什么,它保存在哪里,我如何互動/洗掉它?
下一篇:如何在不指定鍵的情況下使用React-Router-DOMv6`useSearchParams`獲取所有查詢引數?
