我有一個包含回圈的函式,該回圈遍歷物件陣列。在每次迭代中,我需要執行一個異步函式并從請求中回傳一個值,但是,我需要 for 回圈的每次迭代都暫停并等待回應,然后再繼續。
例如:
const tokeniseCustomer = async () => {
const object [{"val1":1,"val2":2},{"val1":"a","val2":"b"}];
for (let index = 0; index < object.length; index = 1) {
const data = await getData(object[index]);
console.log(data);
//wait for data before progressing to next loop iteration
}
};
我認為通過在上面的示例中添加“await”關鍵字,回圈將等待 getData 函式回傳一個值。
上面代碼的問題是沒有任何東西被記錄到控制臺。我嘗試通過添加一些額外的日志記錄來解決這個問題。例如:
const tokeniseCustomer = async () => {
const object [{"val1":1,"val2":2},{"val1":"a","val2":"b"}];
for (let index = 0; index < object.length; index = 1) {
console.log('a')
const data = await getData(object[index]);
console.log('b');
console.log(data);
//wait for data before progressing to next loop iteration
}
};
上面的代碼記錄了“a”而不是“b”。
這就是我的 getData 函式的樣子:
const getData = async (object) => {
//get the data from MSSQL and return it
const result = await MSSQLFUNCTION(object);
return result;
};
我真的不確定我做錯了什么。我在等待中使用 for 回圈是否不正確?
uj5u.com熱心網友回復:
Await 只能在異步函式內部使用。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#:~:text=It can only be used inside an async function
function sleep(ms) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
const object = [
{ val1: 1, val2: 2 },
{ val1: "a", val2: "b" },
];
(async () => {
for (let index = 0; index < object.length; index = 1) {
console.log("a");
const data = await sleep(5000)
console.log("b");
console.log(data);
}
})();
uj5u.com熱心網友回復:
你能試試下面提到的片段嗎:這基本上是在陣列上運行一個 reducer 并等待前一個 promise 完成,然后再執行下一個
const tokeniseCustomer = async () => {
const object = [{"val1":1,"val2":2},{"val1":"a","val2":"b"}];
object.reduce(async (acc, curr) => {
await acc;
return getData(curr);
}, Promise.resolve(null))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/405610.html
標籤:
