Q Library Promise用于检索多个XML文件并按顺序显示它们的模式

时间:2018-06-14 02:42:58

标签: jquery ajax xml promise qlibrary

我实现了这个:

It's possible to 'GET' multiple XML files with javascript?

然而,我的问题更复杂,因为我有更多的xml文件(40)。

我像这样制作了promises数组:

var promises = [ xmlPromise('data/sequence/xml/0.xml'),
                 xmlPromise('data/sequence/xml/1.xml'),
                 xmlPromise('data/sequence/xml/2.xml'),
                 xmlPromise('data/sequence/xml/3.xml'),
                 xmlPromise('data/sequence/xml/4.xml'),

当我在控制台日志中查看xml文件中的数据时:

for (i = 0; i < 40; i++) {
    console.log(responses[i].value);

我注意到它们被添加到promises数组时,响应数组中的文件顺序不一样?相反,订单似乎是完全随机的?重要的是promises和response数组的顺序是相同的。因为我想在下一步做数据。为什么它的顺序不一样?请帮助别人。

==附加==

以下是完整代码:

function xmlPromise(name) {
    return Q.promise(function (resolve, reject, notify) {
        $.ajax({
            type: "GET",
            dataType: "xml",
            async: true,
            url: name,
            contentType: "text/xml; charset=UTF-8"
        })        
       .done(function (data) {
           resolve(data);
        }).fail(function () {
            reject();
        });
    });
};

var promises = [ xmlPromise('data/sequence/xml/0.xml'),
                 xmlPromise('data/sequence/xml/1.xml'),
                 xmlPromise('data/sequence/xml/2.xml'),
                 xmlPromise('data/sequence/xml/3.xml'),
                 xmlPromise('data/sequence/xml/4.xml'),
                 xmlPromise('data/sequence/xml/5.xml'),
                 xmlPromise('data/sequence/xml/6.xml'),
                 xmlPromise('data/sequence/xml/7.xml'),
                 xmlPromise('data/sequence/xml/8.xml'),
                 xmlPromise('data/sequence/xml/9.xml'),
                 xmlPromise('data/sequence/xml/10.xml'),
                 xmlPromise('data/sequence/xml/11.xml'),
                 xmlPromise('data/sequence/xml/12.xml'),
                 xmlPromise('data/sequence/xml/13.xml'),
                 xmlPromise('data/sequence/xml/14.xml'),
                 xmlPromise('data/sequence/xml/15.xml'),
                 xmlPromise('data/sequence/xml/16.xml'),
                 xmlPromise('data/sequence/xml/17.xml'),
                 xmlPromise('data/sequence/xml/18.xml'),
                 xmlPromise('data/sequence/xml/19.xml'),
                 xmlPromise('data/sequence/xml/20.xml'),
                 xmlPromise('data/sequence/xml/21.xml'),
                 xmlPromise('data/sequence/xml/22.xml'),
                 xmlPromise('data/sequence/xml/23.xml'),
                 xmlPromise('data/sequence/xml/24.xml'),
                 xmlPromise('data/sequence/xml/25.xml'),
                 xmlPromise('data/sequence/xml/26.xml'),
                 xmlPromise('data/sequence/xml/27.xml'),
                 xmlPromise('data/sequence/xml/28.xml'),
                 xmlPromise('data/sequence/xml/29.xml'),
                 xmlPromise('data/sequence/xml/30.xml'),
                 xmlPromise('data/sequence/xml/31.xml'),
                 xmlPromise('data/sequence/xml/32.xml'),
                 xmlPromise('data/sequence/xml/33.xml'),
                 xmlPromise('data/sequence/xml/34.xml'),
                 xmlPromise('data/sequence/xml/35.xml'),
                 xmlPromise('data/sequence/xml/36.xml'),
                 xmlPromise('data/sequence/xml/37.xml'),
                 xmlPromise('data/sequence/xml/38.xml'),
                 xmlPromise('data/sequence/xml/39.xml') ];

var results = [];

Q.allSettled(promises).then(function(responses) {
    for (i = 0; i < 40; i++) {
        console.log(responses[i].value);
        results.push(responses[i].value);
    }
});

1 个答案:

答案 0 :(得分:1)

令人惊讶的是,OP代码并没有导致延迟操作的参数与结果之间的对应关系,但我们可以这样强制解决问题...

let objects = [ { name:'data/sequence/xml/0.xml', data:null },
                { name:'data/sequence/xml/1.xml', data:null }, // ...


function xmlGetter(object) {
    return Q.promise(function (resolve, reject, notify) {
        $.ajax({
            type: "GET",
            dataType: "xml",
            async: true,
            url: object.name,                       // <-- changed
            contentType: "text/xml; charset=UTF-8"
        })        
       .done(function (data) {
           object.data = data.value;                // <-- changed
           resolve(object);                         // <-- changed
        }).fail(function () {
            reject();
        });
    });
};

let promises = xmlObjects.map(function(object) {
    return xmlGetter(object);
});

Q.allSettled(promises).then(function() {
    for (i = 0; i < objects.length; i++) {
        console.log('file ' + i + ' data ' + object.data);
    }
});

请注意,代码忽略了allSettled结果(实际上应该是相同的对象集合,以相同的方式排序),因为原始名称/数据集合仍保留在执行上下文中。

这样,无论代码如何选择使用promises或聚合承诺实现如何工作,都无法将数据与params解除关联。另一个好处是代码可以在执行过程中询问对象数组,例如,通过计算data属性中的空值来测量进度。