const result = [1, 2, 3, 4, 5].filter(async (n) => n <= 3)
如果你 console.log(result) 你得到 [1, 2, 3, 4, 5]。為什么不是 [1, 2, 3]?
如果你從函式中洗掉異步,你會得到 [1, 2, 3]。
我只是想知道為什么它會這樣作業。
uj5u.com熱心網友回復:
filter使用原始陣列中的所有值創建一個新陣列,其中您傳遞的函式回傳真值。
async函式回傳 Promise。Promise 是物件。物件是真值。
如果您想使用異步函式執行此操作,則需要等到解決了 Promise 后再測驗真實性。
!async function() {
const data = [1, 2, 3, 4, 5];
const promises = data.map(async(n) => ({
value: n,
include: n <= 3
}));
const data_with_includes = await Promise.all(promises);
const filtered_data_with_includes = data_with_includes.filter(v => v.include);
const filtered_data = filtered_data_with_includes.map(data => data.value);
console.log(filtered_data);
}();
或者,以不解釋每個步驟的格式:
!async function() {
const result = (await Promise.all([1, 2, 3, 4, 5].map(async(n) => ({
value: n,
include: n <= 3
})))).filter(v => v.include).map(data => data.value);
console.log(result);
}();
您還可以避免使用函式方法來支持for回圈中的突變
!async function() {
const test = async(n) => n <= 3;
const data = [1, 2, 3, 4, 5];
const result = [];
for (let i = 0; i < data.length; i ) {
const value = data[i];
if (await test(value)) result.push(value);
}
console.log(result);
}();
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/448900.html
標籤:javascript 异步 筛选
上一篇:檢索列舉類中的值時出錯
下一篇:遞回和異步函式不尊重/等待承諾
