首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在嵌套的Promise中使用时,外部范围的数组被错误地报告为空

在嵌套的Promise中使用时,外部范围的数组被错误地报告为空
EN

Stack Overflow用户
提问于 2020-01-09 00:24:59
回答 1查看 52关注 0票数 1

我正在尝试使用jQuery和Promise异步收集数据。下面是我的代码的一个简要概念:

代码语言:javascript
运行
复制
(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);
    });
})();
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

奇怪的是,在console.log运行之前,我可以看到一个明显的延迟,但在我的控制台中出现了一个空数组。但是,如果我立即进入results,我可以看到那里所期望的一切。我也看不到错误。

我相信这与我在承诺中嵌套承诺有关,但我不知道如何找到bug。

EN

回答 1

Stack Overflow用户

发布于 2020-01-09 00:33:38

这就是使用Promise.all处理promises的方式。将promise放入数组中。而不是解析promises数组,这将提供值数组。

代码语言:javascript
运行
复制
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不会返回任何内容。

代码语言:javascript
运行
复制
(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);
});
})();

这将会起作用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59650033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档