jquery从延迟对象中获取值

时间:2018-01-18 14:07:17

标签: jquery jquery-deferred

我在几个表中有一些<span>个。

<table class="table-transactions">
    <tr>
        <td id="table1">
            <span class="test"></span> blah blah blah
        </td>
    </tr>
</table>

<table class="table-transactions">
    <tr>
        <td id="table2">
            <span class="test"></span> blah blah blah
        </td>
    </tr>
</table>

<table class="table-transactions">
    <tr>
        <td id="table3">
            <span class="test"></span> blah blah blah
        </td>
    </tr>
</table>

<table class="table-transactions">
    <tr>
        <td id="table4">
            <span class="test"></span> blah blah blah
        </td>
    </tr>
</table>

对于每个表,我检查它是否存在(可能不是使用php动态创建的),我使用单独的ajax调用来更新<span>文本,因为它们调用不同的URL。

if($('#table1').length) {
    $.ajax({
        url: 'path/to/script/1',
        type: 'post',
        dataType: 'json',
        data: {
            'data': 'something', 
        },
        success: function(response) {
            $('#table1 .test').text(response);
        }
    });
}

if($('#table2').length) {
    $.ajax({
        url: 'path/to/script/2',
        type: 'post',
        dataType: 'json',
        data: {
            'data': 'something', 
        },
        success: function(response) {
            $('#table2 .test').text(response);
        }
    });
}

if($('#table3').length) {
    $.ajax({
        url: 'path/to/script/3',
        type: 'post',
        dataType: 'json',
        data: {
            'data': 'something', 
        },
        success: function(response) {
            $('#table3 .test').text(response);
        }
    });
}

if($('#table4').length) {
    $.ajax({
        url: 'path/to/script/4',
        type: 'post',
        dataType: 'json',
        data: {
            'data': 'something', 
        },
        success: function(response) {
            $('#table4 .test').text(response);
        }
    });
}

其中一些网址比其他网址更快地返回数据,当填充了所有<span>时,我想运行一个函数。

我考虑过使用延迟对象,但我无法使用它。它运行良好,但我不确定如何:

  • 如何将文本值返回到延迟对象
  • 使用承诺,我不知道如何与他们合作

这就是我想出来的

var promises = [];
var all = function(array) {
    $('.table-transactions').each(function(elm) {
        promises.push(function() {
            return $.Deferred(function(dfd) {
                dfd.resolve($(elm).find('.test').text());
            }).promise();
        });
    });
};

$.when(all(promises)).then(function(results) {

    console.log(results);
    //alert('hello');
});

更新

Here is an example of my ajax calls
$.ajax({
    url: 'path/to/script',
    type: 'post',
    dataType: 'json',
    data: {
        'data': 'something', 
    },
    success: function(response) {
        $('.test').text(response);
    }
});

在成功函数中,我将针对特定的表跨度。这些只是简单的例子。

1 个答案:

答案 0 :(得分:0)

您的功能不会返回任何内容。它应该返回promise数组

此外,$.when并未设计为接受一系列承诺(不幸的是),但您可以使用$.when.apply()

或者在现代浏览器中,您可以使用Promise.all()

var all = function(array) {
    var promises = [];
    $('.table-transactions').each(function(elm) {
        promises.push(function() {
            return $.Deferred(function(dfd) {
                dfd.resolve($(elm).find('.test').text());
            }).promise();
        });
    });
    // return the array
    return promises
};

$.when.apply($, all()).then(function() {    
    console.log(arguments);        
});

// OR
Promise.all( all()).then(function(results){
    console.log(results);
})