Q 库承诺模式,用于检索多个 XML 文件并按顺序显示它们



我实现了这个:

可以使用javascript"获取"多个XML文件吗?

但是,我的问题更复杂,因为我有更多的 xml 文件 (40(。

我像这样做出承诺:

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);

我注意到文件在响应数组中的顺序与添加到 promise 数组中的顺序不同?相反,顺序似乎是完全随机的?承诺和响应数组的顺序必须相同,这一点很重要。因为我接下来想用数据做什么。为什么顺序不同?请帮助某人。

== 附加 ==

以下是完整的代码:

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);
}
});

令人惊讶的是,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结果(实际上应该是相同的对象集合,排序方式相同(,因为原始名称/数据收集仍保留在执行上下文中。

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

相关内容

  • 没有找到相关文章

最新更新