Я пытаюсь разгадать некоторые не совсем тривиальные обещания/асинхронные варианты использования. В примере, с которым я сейчас сражаюсь, у меня есть массив книг, возвращенных из запроса knex (thenable array), который я хочу вставить в базу данных:
books.map(function(book) {
// Insert into DB
});
Каждый элемент книги выглядит следующим образом:
var book = {
title: 'Book title',
author: 'Author name'
};
Однако, прежде чем вставлять каждую книгу, мне нужно получить идентификатор автора из отдельной таблицы, поскольку эти данные нормализованы. Автор может существовать или не существовать, поэтому мне нужно:
- Проверьте, присутствует ли автор в DB
- Если это так, используйте этот идентификатор
- В противном случае вставьте автора и используйте новый идентификатор
Однако вышеупомянутые операции также являются асинхронными.
Я могу просто использовать обещание в исходной карте (выборка и/или вставка идентификатора) в качестве предпосылки операции вставки. Но проблема заключается в том, что, поскольку все выполняется асинхронно, код вполне может вставить дубликаты авторов, поскольку исходный файл check-if-author-exists отделен от блока insert-a-new-author.
Я могу придумать несколько способов достижения вышеуказанного, но все они связаны с разделением цепочки обещаний и, как правило, кажутся немного беспорядочными. Это похоже на проблему, которая должна возникать довольно часто. Я уверен, что мне не хватает чего-то фундаментального здесь!
Любые советы?