我正在尝试使用jQuery和Promise异步收集数据。下面是我的代码的一个简要概念:
(function () {
let promises = [], results = [];
const urls = ["https://cdn.jsdelivr.net/gh/rails/rails/MIT-LICENSE"];
for (let url of urls) {
let p = $.get(url).then(
// The actual job is to parse the response and make new requests
// but for simplicity I'll just make the same request again here
() => promises.push(
$.get(url).then(
data => results.push(data))));
promises.push(p);
}
console.log("Start");
Promise.all(promises).then(function () {
console.log("Done");
console.log(results);
});
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
奇怪的是,在console.log
运行之前,我可以看到一个明显的延迟,但在我的控制台中出现了一个空数组。但是,如果我立即进入results
,我可以看到那里所期望的一切。我也看不到错误。
我相信这与我在承诺中嵌套承诺有关,但我不知道如何找到bug。
发布于 2020-01-09 00:33:38
这就是使用Promise.all处理promises的方式。将promise放入数组中。而不是解析promises数组,这将提供值数组。
var promises = [];
for (let url of urls) {
// Save promise in p
let p = $.get(url)
// push promise p in promises array
promises.push(p);
}
// resolve all promises
Promise.all(promises).then(function (results) {
console.log(results);
});
原始代码不起作用,因为对于每个url,存储在p中的值是一个promise,它将解析为未定义,因为then不会返回任何内容。
(function () {
let promises = [], results = [];
const urls = ["https://cdn.jsdelivr.net/gh/rails/rails/MIT-LICENSE"];
for (let url of urls) {
let p = $.get(url).then(d => {
results.push(d);
// return the value
return d;
});
promises.push(p);
}
console.log("Start");
console.log(promises);
Promise.all(promises).then(function () {
console.log("Done");
console.log(results);
});
})();
这将会起作用。
https://stackoverflow.com/questions/59650033
复制相似问题