В следующем примере, который я написал, показано, как
Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest
для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.
Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist
для заданного набора строк запроса:
[
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
Для каждого элемента новый Promise запустит блок - ExecutionBlock
, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user
и выполняет новый HTTP-вызов в ExecutionProfileBlock
асинхронно.
Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all
.
NOTE Recent Spotify search
API-интерфейсам потребуется указать токен доступа в заголовках запроса:
-H "Authorization: Bearer {your access token}"
Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "
"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Internet Explorer
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// State changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // Done
if (request.status === 200) { // Complete
response(request.responseText)
}
else
response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url = "https://api.spotify.com/v1/"
url += item;
console.log( url )
SimpleRequest.call(url, function(result) {
if (result) {
var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) {
return item.owner.href;
})
resolve(profileUrls);
}
else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // Aggregated results
console.log("All profiles received " + results.length);
//console.log(JSON.stringify(results[0], null, 2));
///// promiseall again
var ExecutionProfileBlock = function(item, index, resolve, reject) {
SimpleRequest.call(item, function(result) {
if (result) {
var obj = JSON.parse(result);
resolve({
name: obj.display_name,
followers: obj.followers.total,
url: obj.href
});
} //result
})
} //ExecutionProfileBlock
promiseAll(results[0], function(item, index, resolve, reject) {
//console.log("Making request [" + index + "] " + item)
ExecutionProfileBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
console.log(JSON.stringify(results, null, 2));
}
, function(error) { // Error
console.log(error);
})
/////
},
function(error) { // Error
console.log(error);
});
Я подробно рассмотрел это решение здесь .
Вы ищете что-то вроде триггеров?
https://github.com/apache/cassandra/tree/trunk/examples/triggers
Триггер базы данных - это процедурный код, который автоматически выполняется в ответ на определенные события в конкретной таблице или представление в базе данных. Триггер в основном используется для поддержания целостности информации в базе данных. Например, когда новая таблица (представляющая нового работника) добавляется в таблицу сотрудников, новые записи также должны создаваться в таблицах налогов, каникул и зарплат.
blockquote>
Если клиенты должны знать об изменениях, мир в основном перешел к модели брокера сообщений - посреднику, который соединяет производителей и потребителей произвольных данных. Здесь вы можете прочитать о Kafka, RabbitMQ и NATS здесь . Здесь есть старая статья DZone . В вашем случае клиент, записывающий в базу данных, также отправит сообщение об изменении. Что приятно в этой модели, вы можете извлечь все, что вам нужно из базы данных.
Kafka интересен тем, что он также может хранить данные. В некоторых случаях вы можете вообще избавиться от базы данных.
Проверьте это будущее jira - https://issues.apache.org/jira/browse/CASSANDRA-8844
Если вам это нравится, проголосуйте за него:)
"В базах данных изменение данных (CDC) представляет собой набор шаблонов проектирования программного обеспечения, используемых для определения (и отслеживания) данных, которые были изменены, так что действие могут быть взяты с использованием измененных данных. Кроме того, изменение данных (CDC) - это подход к интеграции данных, основанный на идентификации, захвате и доставке изменений, внесенных в корпоративные источники данных ». -Wikipedia
Поскольку Cassandra все чаще используется в качестве источника записи (SoR) для критически важных данных на крупных предприятиях, она все чаще призвана выступать в роли центрального центра трафика и потока данных для других системы. Чтобы попытаться решить общую потребность, мы предлагаем реализовать простой механизм регистрации данных для включения шаблонов CDC для каждой таблицы.
blockquote>