我试图从一个或多个来源获取数据,因此我传入一个网址数组来获取数据并做出承诺。
然后我尝试使用Promise.all
来获取所有数据,但我根本没有得到任何数据。
我该如何解决这个问题?
var getData = function (urls) {
var promises = [];
$.each(urls, function (index, url) {
var promise = new Promise(function (resolve, reject) {
$.ajax({
type: 'get',
url: url,
dataType: 'json',
success: function (data) {
console.log(data);
}
});
});
promises.push(promise);
});
console.log(promises);
Promise.all(promises).then(function () {
console.log('Complete');
});
};
答案 0 :(得分:3)
您可以在数组下使用推送响应并在done()
var xhr_request=[];
var responses=[];
$.each(urls, function (index, url) {
// you can push any aysnc method handler
xhr_request.push($.ajax({
url: url,
type:'get',
dataType:'json',
data:{user_name: users[i]},
success: function(data){
console.log('success of ajax response')
responses.push(data);
}
}));
});
$.when.apply(null, xhr_request).done( function(){
// all done
console.log('all request completed')
console.log(responses);
});
这里$ .when提供了一种基于零个或多个对象执行回调函数的方法,通常是表示异步事件的Deferred对象。
$ .appate将数组元素转换为函数
中的不同参数$。完成所有异步后调用函数。请求已完成。
答案 1 :(得分:2)
这就是我编写代码的方式(因为我通常不使用jQuery,我有点撒谎)
var getData = function (urls) {
Promise.all($.map(urls, function (index, url) {
return $.ajax({
type: 'get',
url: url,
dataType: 'json'
});
})).then(function (responses) {
console.log('Complete');
console.log(responses); // responses in an array
});
};
$.ajax
返回一个promise,不需要将它包装在Promise构造函数中
使用$.map
代替$.each
并返回jquery promise - 允许您将整个$.map
包装为Promise.all
参数
我不知道为什么你说你没有得到“任何东西” - 即使你的代码不是很正确,它应该仍然启动$ .ajax并给你控制台输出< / p>
答案 2 :(得分:0)
而不是
var promise = new Promise(function (resolve, reject) {
$.ajax({
type: 'get',
url: url,
dataType: 'json',
success: function (data) {
console.log(data);
}
});
});
为什么不是
var promise =
$.ajax({
type: 'get',
url: url,
dataType: 'json',
success: function (data) {
console.log(data);
}
});
您已经通过$.ajax
返回了承诺。所以你不需要把它包装在另一个Promise中。