gpt4 book ai didi

jquery - 将 RSVP.js 中的一系列 Promise 与 jQuery 的 $.ajax 集成

转载 作者:行者123 更新时间:2023-12-01 01:07:28 25 4
gpt4 key购买 nike

回复:https://github.com/tildeio/rsvp.js

将 RSVP.js 与 jQuery 的 $.ajax 集成的最佳方式是什么?经过一些阅读和研究后,我发现 Ember 正在积极开发围绕它的包装器...... https://github.com/emberjs/ember.js/pull/4148

有人对这种 promise 用例有经验吗?

我使用 RSVP.js 是因为我通过 .all() 方法处理动态的 Promise 数组。

数组中的每个 promise 都有自己的 promise ,一旦完成从函数递归轮询数据,这些 promise 就会得到满足。我在考虑如何构建代码时遇到问题。

如果您感兴趣的话,用例是我正在向我的 API 发送一个 AJAX 请求,以获取与特定资源相关的报告,该资源返回一个 URL 端点列表,应该访问该列表以获取有关其子项的更多报告数据资源。然后,每个资源都会返回一个 JSON 对象,其中包含特定日期的报告数据和另一个包含第二天(或一组天)参数的 URL。然后,这将继续从同一端点轮询“下一个”数据,直到没有任何剩余。

预先感谢任何可以提供帮助的人!

此外,如果您对如何格式化此代码以使其更具可读性和可维护性有任何指导,我很想听听。

代码:

url = "http://localhost:3000/api/foo_resources/1/reports/bar"

var headers = {
"Accept": 'application/vnd.xps+json; version=1', // Headers for API access
"X-User-Email": 'example@company.com',
"X-User-Token": '1234abcd',
}

$.ajax({
type: 'GET',
url: url,
headers: headers,
dataType: 'json',
xhrFields: {
withCredentials: true
}
}).then(function(response) {

// the ajax request would return a long list of bucket like this with endpoints to hit {
// {
// "buckets": [
// "http://localhost:3000/api/foos_nested_resources/1/reports/bar"
// "http://localhost:3000/api/foos_nested_resources/2/reports/bar"
// "http://localhost:3000/api/foos_nested_resources/3/reports/bar"
// ]
// }

var promises = response.buckets.map(function getReportData(bucket) {

return new RSVP.Promise(function(resolve, reject) {
var recursiveRequest = function(bucket) {
$.ajax({
type: 'GET',
url: bucket,
headers: headers,
dataType: 'json',
xhrFields: {
withCredentials: true
}

// This is the report that comes back, obviously truncated significantly for this example
// {
// reports: [
// { id: 1, datapoint_a: 5438, datapoint_b: 1389 },
// { id: 2, datapoint_a: 4336, datapoint_b: 2236 }
// ],
// next: "http://localhost:3003/api/nexted_foo_resources/1/reports/bar?ends=2014-02-06&starts=2014-01-24"
// }

}).done(function(response) {
$.merge(reports, response.reports); // I could use concat here but I prefer readability

if (response.next) {
recursiveRequest(response.next);
} else {
resolve(reports);
}
}).error(function(error) {
reject(error);
});
};

recursiveRequest(bucket);
});
});

RSVP.all(promises).then(function(data) {
console.dir(data);
}).catch(function(error) {
console.dir(error);
})
})

最佳答案

需要注意的是,我还没有测试过这段代码(因为我手头没有你的 API),我认为像下面这样的东西更接近 RSVP 的惯用用法:

var initialUrl = "http://localhost:3000/api/foo_resources/1/reports/bar";

var headers = {
"Accept": 'application/vnd.xps+json; version=1', // Headers for API access
"X-User-Email": 'example@company.com',
"X-User-Token": '1234abcd',
};

function rsvpAjax(opts){
return new RSVP.promise(function(resolve, reject){
var defaultOpts = {
type: 'GET',
headers: headers,
dataType: 'json',
xhrFields: {
withCredentials: true
}
};
$.ajax($.extend({}, defaultOpts, opts, {
success: function(json) {
resolve(json);
},
error: function(jqXhr, textStatus, errorThrown){
reject({ jqXhr: jqXhr, textStatus: textStatus, errorThrown: errorThrown});
}
}));
});
}

function requestBucket(bucket){
return rsvpAjax({ url: bucketUrl }).then(bucketResponseProcessor(bucket));
}

function bucketResponseProcessor(bucket){
return function(response){
$.merge(bucket.reports, response.reports);
if (response.next) {
bucket.url = response.next;
return requestBucket(bucket);
} else {
return bucket.reports;
}
};
}

rsvpAjax({ url: initialUrl }).then(function(response) {
return RSVP.all(response.buckets.map(function(bucketUrl){
var bucket = { url: bucketUrl, reports: [] };
return requestBucket(bucket).then(processBucketResponse);
}));
}).then(function(reports) {
console.dir(data);
}).catch(function(error) {
console.dir(error);
});

关于jquery - 将 RSVP.js 中的一系列 Promise 与 jQuery 的 $.ajax 集成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591865/

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