我已經嘗試了一千種方法來做到這一點,但沒有一種能正常作業。這里 msg1 和 msg2 是我想要同步呼叫的函式的替代(第一個然后另一個)。for 回圈在第二個回圈中產生“未知”。搜索后,我認為這是正確的方法,但我仍然不在那里。我想得到的答案是:
msg1
msg2
但我得到
msg1
msg1
這是我的代碼
var data = {
"messages": ["msg1", "msg2"],
"i": -1
}
const increment = async () => {
data.i = await data.i 1;
};
const test = async () => {
data.messages.forEach((fcn) => {
increment(data)
.then(() => {
console.log(data.messages[data.i])
return data
})
})
};
test(data)
更新
jfriend00(下)的異步回答有效!!!但是,當在我的實際代碼中使用時,它會運行一個額外的時間,在最后一個回圈中產生“未定義”。我嘗試更改 i 的起始值、for 回圈的不同公式并添加對值“未定義”的檢查(如下所示),但未定義的值仍然未被檢測到。我也延長了延遲(不成功)。如何確保回圈每條訊息只運行一次?
if (data.i !== undefined) {
console.log(data.messages[data.i])
}
uj5u.com熱心網友回復:
由于這里沒有任何異步內容,您可以洗掉所有async,await然后.then()運行您的同步代碼(您可以直接在瀏覽器中運行每個片段以查看它們發送到控制臺的內容)。
var data = {
"messages": ["msg1", "msg2"],
"i": -1
}
const increment = () => {
data.i;
};
const test = () => {
data.messages.forEach((fcn) => {
increment(data)
console.log(data.messages[data.i])
});
};
test(data)
如果您希望該increment()函式是一個實際的異步操作并且您想對呼叫進行排序,increment()那么您必須放棄.forEach()并使用for回圈并await適當地使用并將實際上異步的東西插入到increment()函式中(我插入了一個基于承諾的延遲):
function delay(t) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
var data = {
"messages": ["msg1", "msg2"],
"i": -1
}
const increment = async () => {
await delay(100);
data.i;
};
const test = async () => {
for (let msg of data.messages) {
await increment(data);
console.log(data.messages[data.i])
}
};
test(data)
注釋
您現有的代碼正在濫用async,await和.then(). 現有代碼中的任何地方都沒有異步操作,因此沒有任何理由,async因為這只會使事情變得比要求的更復雜。await.then()
此外,您只await在等待承諾時使用。所以,data.i = await data.i 1;誤入歧途。它會運行,但await不會做任何有用的事情——它只會使代碼更復雜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498355.html
