var str_list = ["..."];
let myFunction = async () =>
{
const promises = [];
for (i = 0; i < length; i++)
{
promises.push(new Promise((resolve, reject) =>
{
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return (await Promise.all(promises)).filter(f => f !== false);
}
Попробуйте это.По сути, он добавляет все обещания в массив, а затем вызывает для них Promise.all
, который выполняет их параллельно и ожидает завершения всех.
Затем результатывозвращаются по порядку, те результаты, которые были переданы в функцию resolve()
в каждом Promise
, и будут str_list[i]
или false
.Затем вызов filter()
удаляет все записи, которые false
.
Если вы хотите быть краткими, то это может быть значительно упрощено:
var str_list = ["..."];
let myFunction = async () =>
{
const promises = str_list.map(async (value, index) => condition ? value : false);
return (await Promise.all(promises)).filter(f => f !== false);
}
Этот код работает так же, как и первый фрагмент кода;это просто намного короче.
Я сделал метод async
, потому что нет способа вернуть результаты Promise
без await
его использования.Если вы не хотите использовать метод async
, вы можете либо вернуть Promise
, который затем можно подождать с помощью await
или .then()
:
var str_list = ["..."];
let myFunction = () => {
const promises = [];
for (i = 0; i < length; i++) {
promises.push(new Promise((resolve, reject) => {
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return Promise.all(promises).then(strs => strs.filter(f => f !== false));
}
// myFunction().then(results => ...)
Или вы можете использовать обратный вызов:
var str_list = ["..."];
let myFunction = (callback) =>
{
const promises = [];
for (i = 0; i < length; i++)
{
promises.push(new Promise((resolve, reject) =>
{
const condition = // ...
resolve(condition ? str_list[i] : false);
}));
}
return Promise.all(promises).then(results => callback(results.filter(f => f !== false));
}
// myFunction(results => ...);