gpt4 book ai didi

javascript - 使用 RSVP.js Promise 库运行多个 JavaScript Promise

转载 作者:行者123 更新时间:2023-11-29 15:32:30 27 4
gpt4 key购买 nike

下面的简单演示 JavaScript 代码使用 RSVP.js Promise 库 https://github.com/tildeio/rsvp.js/使用 AJAX 加载一些 JSON 数据,并在加载完所有 JSON 数据后触发一些代码。

我想扩展它以在加载不是 AJAX 请求的 JSON 数据后做更多的 promise 。

例如,在加载 JSON 数据后,我想创建另一个 Promise,它将运行一个函数,该函数将设置一些 DOM 事件处理程序/监听器。

在设置事件处理的函数之后,我想在事件设置完成后运行一些其他函数。

我是新手,仍在学习 Promises,在某些情况下仍在学习 JavaScript,因此我需要一些帮助。非常感谢在下面和 JSFIddle 上扩展我的示例代码!

我相信,如果展示了如何向我的演示中再添加 1 个 promise ,那么我在最终应用中添加所需的数量就足够了。

以下代码的 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


更新

我在这里更新了我的 JSFiddle 演示 http://jsfiddle.net/jasondavis/fttzoggj/2添加一个新函数 initDomEvents() 并将其添加到 then(initDomEvents) 调用中。我的控制台显示所有内容都按我希望的方式运行,但是由于某种原因,现在触发了我的错误

最佳答案

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

initDomEvents 函数中没有resolvereject 函数。它们仅作为参数提供给 new RSVP.Promise(...) 回调。尝试调用它们会抛出一个错误,该错误会被捕获并传播到您的错误处理程序(但它没有 .statusText 属性,因此仅打印 undefined )。

正如我在评论中所说,如果您的函数不执行任何异步操作,则无需返回 promise 。您只需从 promise 回调中返回一个值或抛出一个异常。
如果您坚持围绕您的结果或拒绝做出 promise ,您可以使用 RSVP.Promise.resolve(…)RSVP.Promise.reject(…)函数来创建已履行/已拒绝的 promise 对象。

关于javascript - 使用 RSVP.js Promise 库运行多个 JavaScript Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com