【发布时间】:2016-01-27 07:56:05
【问题描述】:
下面的简单演示 JavaScript 代码使用 RSVP.js Promise 库 https://github.com/tildeio/rsvp.js/ 使用 AJAX 加载一些 JSON 数据,并在加载完所有 JSON 数据后触发一些代码。
我想扩展它以在 JSON 数据加载后执行更多不是 AJAX 请求的 Promise。
例如,在 JSON 数据加载后,我想创建另一个 Promise,它将运行一个设置一些 DOM 事件处理程序/侦听器的函数。
在设置事件处理的函数之后,我想在事件设置完成后运行其他函数。
我很新,还在学习 Promises,在某些情况下还在学习 JavaScript,所以我可以使用一些帮助。非常感谢在下面和 JSFIddle 上扩展我的示例代码!
我相信,如果展示了如何在我的演示中再添加 1 个 promise,那么我在最终应用中添加任意数量的 promise 就足够了。
JSFIddle Demo代码如下: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.
});
更新
我在这里更新了我的 JSFiddle 演示 http://jsfiddle.net/jasondavis/fttzoggj/2 添加了一个新函数 initDomEvents() 并将其添加到 then(initDomEvents) 调用中。我的控制台显示一切都按照我的意愿运行,但是由于某种原因,现在我的错误被触发了
【问题讨论】:
-
由于每个
.then()调用都会返回一个promise,因此您可以将.then()s 链接到EOF。继续吧! -
@Bergi 我读到了一些关于它返回来自先前承诺的数据被传递到每个
then()的内容,我有点困惑,因为我不确定我是否想要这样?我也总是准备好它对异步函数调用的意义,以及在我想要在我的 JSON 数据加载后初始化一堆事件的新函数中,所以当我听到异步时,我认为 AJAX 不是 100% 确定我是否会简单地制作我的活动的常规功能并在其中调用resolve()...... -
@Bergi ...继续....关于我的应用程序的一些小信息。它加载各种与项目管理相关的 JSON 数据。接下来,它为任务模式窗口加载一个任务 JSON 数据,在该窗口中,我必须为诸如日期选择器插件、一些用于里程碑的弹出框插件、分配的用户、降价处理等等之类的东西设置各种事件和库。我只是想基本上使用 Promises 以特殊顺序执行此过程的每个部分,以便某些内容不会在其他内容之前加载....
-
@Bergi ...继续...示例在构建任务模式并添加到 DOM 后,有时我的 Datepicker 库会在库完全加载之前运行时抛出错误。跨度>
-
也许看看my answer to "Aren't promises just callbacks?"。请注意,promise 回调也可以是同步的,你不需要需要返回一个 promise(但你可以,如果你想等待某些东西)。 “设置事件”听起来是同步的,“加载库”是异步的,应该返回一个承诺。
标签: javascript promise rsvp.js