2015-10-27 3 views
3

Простой демонстрационный 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. 
}); 

enter image description here


UPDATE

Я обновил свой JSFiddle демо здесь http://jsfiddle.net/jasondavis/fttzoggj/2 добавляя новую функции initDomEvents() и добавить его в то (initDomEvents) вызов. Моя консоль показывает, что все запущено, поскольку я хочу, чтобы она по какой-то причине, теперь моя ошибка запущена

+0

Поскольку каждый вызов '.then()' возвращает обещание, вы можете связать '.then()' s til EOF. Просто вперед! – Bergi

+0

@Bergi Я читаю что-то о нем, возвращая данные из предыдущего обещания, передается в каждый 'then()', и я немного путаюсь там, поскольку я не уверен, хочу ли я этого или нет? Я также всегда готов к тому, как он предназначен для вызовов функции асинхронного вызова и в новой функции, где я хочу начать кучу событий, когда мои данные JSON загрузились, поэтому, когда я слышу async, я думаю, что AJAX так не был на 100% уверен, если бы я просто сделал регулярную функцию для моих событий и вызов 'resolve()' в ней ...... – JasonDavis

+0

@Bergi ... продолжение .... Небольшая информация о моем приложении. Он загружает все виды данных JSON, связанных с управлением проектами. Затем он загружает данные задачи JSON для задачи Модальное окно, в котором я должен настраивать все виды событий и библиотек для таких вещей, как плагины datepicker, некоторые плагины для popovers для этапов, назначенных пользователей, обработок уценки и целая группа. Я просто хочу использовать Promise для выполнения каждой части этого процесса в специальном порядке, чтобы некоторые вещи не загружались до того, как другие ... – JasonDavis

ответ

1

My console shows all is ran as I want it to however for some reason, now my error is triggered

Там нет resolve и reject функции в вашей initDomEvents функции. Они представлены в качестве аргументов только для обратного вызова new RSVP.Promise(…). При попытке вызвать их выдается ошибка, которая попадает и распространяется на ваш обработчик ошибок (но у него нет свойства .statusText, поэтому печатается только undefined).

Как я уже сказал в комментариях, если ваша функция ничего не делает асинхронной, нет необходимости возвращать обещание. Вы просто return значение или throw исключение, а также ваш ответный ответ.
Если вы настаиваете на создании обещаний вокруг своих результатов или отклонений, вы можете использовать функции RSVP.Promise.resolve(…) или RSVP.Promise.reject(…) для создания отработанных/отклоненных объектов обещания.

+1

Я также вижу, как много моего кода типа не ajax можно просто вызывать внутри 'then (function (results) {/ * non async code * /})' вместо своей собственной функции Promise .... I упомянуть об этом в ответ на «функция ничего не делает асинхронной, нет необходимости возвращать обещание». Я вижу, что вы сейчас имеете в виду – JasonDavis

0

Любые конкретные причины, по которым вы используете RSVP? Я бы переключился на jQuery Promises.

var d = $.Deferred; 

$.ajax({ 
url: url, 
cache: true, 
dataType: 'json', 
success: function(data){ 
    d.resolve(data); 
}, 
error: function(error){ 
    d.reject(); 
} 
}); 

$.when(d).then(function(data){ 
    //handle 
}); 
+1

Я читал много статей о том, как jQuery получил обещания неправильно, а в jQuery v3 они планируют исправить и изменить их, чтобы они были более совместимы с ES6 поэтому я не хотел использовать сломанный стиль, просто чтобы изменить его в год по дороге – JasonDavis

+0

Также перед использованием RSVP.js я использовал jQuery Promises. Я также много обзоров, где RSVP должен быть одной из лучших библиотек Promise. – JasonDavis

+0

Когда я использовал jQuery Promises, я фактически предпочел называть свой собственный 'd.resolve (data);' как ваша демо, но мне все время говорили, что Я не должен, так как вызов jQuery AJAX уже делает это – JasonDavis

 Смежные вопросы

  • Нет связанных вопросов^_^