Простой демонстрационный JavaScript-код ниже использует библиотеку PromVisk RSVP.js https://github.com/tildeio/rsvp.js/ для загрузки некоторых данных JSON с использованием AJAX и по завершении запускает некоторый код после загрузки всех данных JSON.Запуск нескольких обещаний по JavaScript с библиотекой Promise RSVP.js
Я хочу расширить его, чтобы сделать еще несколько обещаний после загрузки данных JSON, которые не являются запросами AJAX.
Например, после загрузки данных JSON я хочу создать другое Promise, которое будет запускать функцию, которая будет устанавливать некоторые обработчики/слушатели DOM Event.
После функции, которая настраивает обработку событий, я хотел бы затем запустить другую функцию после того, как события завершили настройку.
Я очень новый и изучаю Обещания по-прежнему, а в некоторых случаях все еще изучая JavaScript, чтобы я мог использовать некоторую помощь. Пример кода, расширяющего мой ниже и на JSFIddle, был бы очень благодарен!
Я считаю, что если будет показано, как добавить еще одно обещание моей демоверсии, тогда мне будет достаточно добавить столько, сколько мне нужно в моем последнем приложении.
JSFIddle Демонстрация кода ниже: http://jsfiddle.net/jasondavis/fttzoggj/
var jsonPromiseCache = {};
// AJAX function to load JSON data using Promise()
var getJsonDataPromise = function(url, key) {
if (!jsonPromiseCache[key]) {
jsonPromiseCache[key] = new RSVP.Promise(function(resolve, reject){
// If jsonPromiseCached data is not set then make AJAX requiest to get it
var client = new XMLHttpRequest();
client.open("GET", url);
client.onreadystatechange = handler;
client.responseType = "json";
client.setRequestHeader("Accept", "application/json");
client.send();
console.log('---- "client" XMLHttpRequest/AJAX variable ======= ',client);
function handler() {
if (this.readyState === this.DONE) {
// On AJAX success, resolve() our Promise() and set result to cached variable
// to avoid duplicate AJAX requests for this jsonCache[key] Data where "key"
// is used to assign to each AJAX endpoint URL/request of JSON data...
// (milestones, tasks, users, etc...)
if (this.status === 200) {
jsonPromiseCache[key] = this.response;
console.log('---- jsonPromiseCache['+key+'] ====== ',jsonPromiseCache[key]);
// Resolve() the Promise() on AJAX success
resolve(this.response);
// On AJAX failure, reject() our Promise()
}else{
reject(this);
}
}
};
// If JSON data for this key is already jsonPromiseCached, then return the jsonPromiseCached version
// instead of making a new AJAX request!
});
}
return jsonPromiseCache[key];
};
// EXAMPLE USAGE DEMO
// usage loading JSON data with AJAX using Promises
var promises = {
users: getJsonDataPromise('/echo/json/', 'users'),
task: getJsonDataPromise('/echo/json/', 'task')
};
RSVP.hash(promises)
.then(function(results) {
console.log('then() function ran on success of loading JSON data');
console.log(results);
console.log('results.users', results.users); // print the users JSON results
console.log('results.task', results.task); // print the task JSON results
// I want to create another Promise here which will run a function that creates a bunch of DOM Event handlers/listeners and in that function when it is done loading it should fire a success like the above does when JSON data is done loading
})
.finally(function(){
console.log('finally() function ran on success and failure.... It is always ran!');
})
.catch(function(reason){
console.log('[ERROR] REASON:',reason.statusText); //if any of the promises fails.
});
UPDATE
Я обновил свой JSFiddle демо здесь http://jsfiddle.net/jasondavis/fttzoggj/2 добавляя новую функции initDomEvents() и добавить его в то (initDomEvents) вызов. Моя консоль показывает, что все запущено, поскольку я хочу, чтобы она по какой-то причине, теперь моя ошибка запущена
Поскольку каждый вызов '.then()' возвращает обещание, вы можете связать '.then()' s til EOF. Просто вперед! – Bergi
@Bergi Я читаю что-то о нем, возвращая данные из предыдущего обещания, передается в каждый 'then()', и я немного путаюсь там, поскольку я не уверен, хочу ли я этого или нет? Я также всегда готов к тому, как он предназначен для вызовов функции асинхронного вызова и в новой функции, где я хочу начать кучу событий, когда мои данные JSON загрузились, поэтому, когда я слышу async, я думаю, что AJAX так не был на 100% уверен, если бы я просто сделал регулярную функцию для моих событий и вызов 'resolve()' в ней ...... – JasonDavis
@Bergi ... продолжение .... Небольшая информация о моем приложении. Он загружает все виды данных JSON, связанных с управлением проектами. Затем он загружает данные задачи JSON для задачи Модальное окно, в котором я должен настраивать все виды событий и библиотек для таких вещей, как плагины datepicker, некоторые плагины для popovers для этапов, назначенных пользователей, обработок уценки и целая группа. Я просто хочу использовать Promise для выполнения каждой части этого процесса в специальном порядке, чтобы некоторые вещи не загружались до того, как другие ... – JasonDavis