如何将相同的帖子发送到多个服务器并将数据与单个帖子相关联

时间:2014-07-01 11:04:33

标签: javascript jquery ajax post

我正在尝试向多个服务器发送一个帖子请求(可能的坦克到CORS)。 要做到这一点,我有一个带有jQuery帖子的数组,并为完成的个人注册相同的回调函数,如下所示:

var requestUrls = getRequestUrlArrayFromForm();
var companyNames = getCompanyNamesArrayFromForm();

cleanTable();
for(var i = 0; i < requestUrls.length; i++) {

  postings.push($.post(requestUrls[i],
    someXmlString                               
  ));

  postings[i].done(function( response , textStatus, jqXHR) {    

    console.log(i); // the number printed here is always the same even for requestUrls.length > 1
    addToTable(companyNames[i], response);      

  }).fail(function( jqXHR ) {
    // do something
  });

}

我现在的问题是我想要记住与每个帖子相关的一些数据,例如在这个例子中是一个companyName。但是在帖子的成功功能中,我不知道我的n-post请求中的哪一个,因此无法知道正确的索引确实在我的companyName数组中访问正确的值。好吧,我猜它是因为ajax的异步行为。但无论如何,这个问题应该可以解决。

那么是否可以将一些数据传递给post对象,而post对象不会被发送到服务器但只是被客户端记住并且可以在done函数回调中访问?

提前致谢。

3 个答案:

答案 0 :(得分:1)

你需要的方式是这样的

var requestUrls = getRequestUrlArrayFromForm();
var companyNames = getCompanyNamesArrayFromForm();

cleanTable();
var postings = [];
for (var i = 0; i < requestUrls.length; i++) {
    postings.push($.post(requestUrls[i], someXmlString));
}

$.when.apply($, postings).done(function () {
    for (var i in arguments) {
        addToTable(companyNames[i], arguments[i][0]); // the response
    }
});

根据OP评论,更新回答

var requestUrls = getRequestUrlArrayFromForm();
var companyNames = getCompanyNamesArrayFromForm();

cleanTable();
for (var i = 0; i < requestUrls.length; i++) {
    (function (i) {
        $.post(requestUrls[i], someXmlString).done(function (resp) {
            addToTable(companyNames[i], resp);
        });
    })(i);
}

你需要用封口包裹它。

sample working demo

答案 1 :(得分:0)

这样的事情怎么样?

var requestUrls = getRequestUrlArrayFromForm();
var companyNames = getCompanyNamesArrayFromForm();

cleanTable();
for(var i = 0; i < requestUrls.length; i++) {

  $.post( requestUrls[i], someXmlString)
    .done(function(response , textStatus, jqXHR) {
        addToTable(companyNames[i], response);
    })
    .fail(function( jqXHR ) {
        // do something
    });

}

答案 2 :(得分:0)

也许包装函数会有所帮助:

var requestUrls = getRequestUrlArrayFromForm();
var companyNames = getCompanyNamesArrayFromForm();

cleanTable();
for(var i = 0; i < requestUrls.length; i++) {

    postings.push($.post(requestUrls[i],
        someXmlString                               
    ));

    postings[i].done((function(j){ 
        return function( response , textStatus, jqXHR ) {    
            console.log(j); 
            addToTable(companyNames[j], response);      
        }
    })(i)).fail(function( jqXHR ) {
        // do something
    });

}