通过承诺从多个来源获取数据

Getting data from multiple sources with promises

本文关键字:获取 数据 承诺      更新时间:2023-09-26

我试图从一个或多个来源获取数据,所以我传递了一个url数组来获取数据并做出承诺。

然后我尝试使用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');
    });
};

可以在数组下使用push响应,并在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对象)执行回调函数的方法。

$。Apply将数组元素转换为函数

中的不同参数

$。完成是调用函数后,所有异步。请求已完成

这是我编写代码的方式(有点,因为我通常不使用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承诺-允许您将整个$.map包装为Promise.all参数

我不明白的是为什么你说你没有得到"任何东西"——即使你的代码不太正确,它仍然应该踢开$。并给出控制台输出

代替

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中包装它