- Вы используете функцию карты, поскольку вам нужно обернуть ее функцией Promise.allSettled.
Promise.allSettled доступен в версии node js 12 и выше. если вы используете узел меньше 12, вам нужно использовать Promise.all
Promise.allSettled () : метод Promise.allSettled () возвращает обещание, которое разрешается после всех данные обещания либо выполнены, либо отклонены, с массивом объектов, каждый из которых описывает результат каждого обещания.
Обычно он используется, когда у вас есть несколько асинхронных задач, которые не зависят друг от друга для успешного выполнения, или вы всегда хотели бы знать результат каждого обещания.
Promise.all () : метод Promise.all () принимает в качестве входных данных итерацию обещаний и возвращает single Promise как выход. Это возвращенное обещание разрешится, когда все входные обещания разрешены и не-обещания вернулись, или если итерируемый входной объект не содержит обещаний. Он немедленно отклоняет любое из входных обещаний, отклоняющих или не-обещаний, вызывающих ошибку, и будет отклонять с этим первым сообщением / ошибкой об отклонении.
Обычно используется, когда есть несколько асинхронных задач, которые зависят от одной другой для успешного завершения, так как он не ждет и немедленно отклоняет любое из входных обещаний.
см. это:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/allSettled
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all
https://sung.codes/blog/2019/05/18/promise-race-vs-promise-any-and-promise-all-vs-promise-allsettled/
const search_and_add = (req, res, spotifyAPI, to_filter, playlist_id) {
return Promise.allSettled(to_filter.map(async (tag) => {
const song_details = await spotifyAPI.searchTracks(tag.name, { limit: 1 });
//const song_uri = song_details['body']['tracks']['items'][0]['id'];
console.log(song_details);
return song_details;
}).catch(function(err){
console.log(err);
return err;
});
}
Для обработки ошибок в asyn c await:
Asyn c Await, по сути, синтаксис c сахар для обещаний, и если оператор await ошибается, он вернет отклоненное обещание. Вместо добавления try -catch каждый раз, когда мы можем написать вспомогательную функцию, которая обертывает наши express маршруты для обработки всех отклоненных обещаний маршрута.
const asyncMiddleware = fn =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next);
};
затем оберните свою функцию маршрута следующим образом
router.get('/users/:id', asyncMiddleware(async (req, res, next) => {
/*
if there is an error thrown in getUserFromDb, asyncMiddleware
will pass it to next() and express will handle the error;
*/
const user = await getUserFromDb({ id: req.params.id })
res.json(user);
}));
Примечание: вы также можете использовать npm package asyn c -среднее ПО для этого.