2016-10-05 7 views
2

У меня есть этот код:Как сделать вызов ajax для каждого элемента массива объектов, используя обещания?

 // _arrOfUsers = array of objects, each object represents a user. 
     //For example, a single object may be something like {name:"mike", id:"123"}  

      var _successUsers = function (_arrOfUsers) {    
        var promises = []; //empty array of promises 

         _arrOfUsers.forEach(function (user) { 
          promises.push(function() { 
           return $.Deferred(function (dfd) { 
            $.post("//sessionID", 
               queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"), 
             'text', 'text/plain', this, 
             function (dataX) { 
              dfd.resolve(dataX); 
             }); 
           }).promise(); 
          }); 
        }); 

        $.when(promises).then(function (results) { 
         console.log(results); 
        }); 

       }; 

Некоторые элементы, чтобы понять этот код:

**** Настройки вызовов Ajax

  • URL: sessionURL
  • данных: данные для передачи сервер является внешним вызовом модуля queryServ.js и функцией getAllUserDomainCommentsFunct, что возвращает объект JSON. Необходимо эти параметры работы: currentDomain, USERID, currentDomain (опять же), CURRENTURL
  • Тип: Текст
  • CONTENTTYPE: текст/равнина
  • контекст: это

**** A комментарий является jsonObject smilar до {id: "998", textOfcomment:"I commented this", target: "//targetID"}.

Что я хочу сделать, это сделать ajax-вызов для каждого пользователя массива «_arrOfUsers», чтобы извлечь все его комментарии на сервер; после всех «экстракций» мне нужно получить все результаты (это все комментарии от всех пользователей) и распечатать их в консоли. Порядок для моего кода важен, поэтому я использую Promises.

Я нашел структуру этого алгоритма на JSfiddle здесь, в StackOverflow, но он не работает для меня, потому что он возвращает массив функций, и я не могу понять, почему, вероятно, потому, что я никогда не использовал Promises во время моя карьера.

Спасибо заранее, если есть что-то непонятное, пожалуйста, не стесняйтесь говорить мне.

ответ

2

Здесь нет необходимости создавать отложенные здесь, так как $.post() уже возвращает обещание, а $.when() сохраняет результаты для вас. Вместо этого, вы можете сделать это:

$.when.apply($, _arrOfUsers.map(function(user) { 
    return $.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL")); 
})).then(function() { 
    // all results available in order here as arguments to this callback 
    // arguments[0][0] is the first result 
    // arguments[1][0] is the second result 
    // arguments[2][0] is the third result and so on 
    for (var i = 0; i < arguments.length; i++) { 
     // arguments[i][0] is next one of your results 
    } 
}); 

Примечание: Я не совсем понимаю, что вы пытаетесь сделать с аргументами $.post() (вы, кажется, сделали некоторые аргументы док JQuery не показывают) поэтому я несколько упростил его, но вам может понадобиться настроить те аргументы $.post() в соответствии с вашими потребностями.


Лично я презираю $.when() и как он взаимодействует с JQuery Ajax обещаниями (очень запутанными, чтобы использовать), так что я бы бросил АЯКС обещание на обещание ES6 и использовать Promise.all() (с использованием Bluebird для поддержки обещания, если старше поддержка браузера необходим).

Promise.all(_arrOfUsers.map(function(user) { 
    return Promise.resolve($.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"))); 
})).then(function(results) { 
    // results is an array of results in order 
}); 

Или, если вы включите Bluebird, вы можете использовать:

Promise.map(_arrOfUsers, function(user) { 
    return Promise.resolve($.post("//sessionID", queryServ.getAllUserDomainCommentsFunc("//currentDomainID", user.iD, "//currentDomainID", "//currentURL"))); 
}).then(function(results) { 
    // results is an array of results in order 
}); 
+0

Спасибо за ваш комментарий jfriend00, Попробую свой код, как только possibile. В любом случае я добавил эти аргументы, потому что пытался сохранить все аргументы $ .ajax (url [, settings]) .. но в любом случае я не уверен, что это правильно! – nicoperillo

+0

@nicoperillo - Если вы собираетесь передать все эти аргументы в '$ .post()', вы должны поместить их в объект и передать объект. – jfriend00

+0

Ваш код отлично работает!Большое спасибо! – nicoperillo