javascript - 收集多个 promise 结果? (纯javascript)

标签 javascript es6-promise

我是 Promises 的新手,我尝试先从本地存储加载大量结果,如果失败,再从服务器获取数据。我不想使用 jquery - 忽略我目前正在使用 $.getJSON :-/

function loader1() {
    return new Promise(function (resolve, reject) {
        localforage.getItem("data1").then(function (value) {
            if (value !== null) {
                resolve(value);
            } else {
                $.getJSON("/myapp/data1.json").then(function (data) {
                    if (data !== null) {
                        resolve(data);
                    }
                }).catch(function (err) {
                    reject(err);
                });
            }
        });
    });
}

对于一个文件来说没问题。那么我会

loader1().then(function(result) { 
    // we have a result
    doSomethingElse();
}).catch(function (err) {
    // problem
});

但我想对多个文件执行此操作,其中一些文件位于本地存储中,而另一些文件则从远程源加载 json。我想加载所有内容,加载完成后,执行我的应用程序的下一步。

Promise.all 似乎是问题所在,但我看不到如何获取每个加载器的结果;我在想它会是这样的:

Promise
    .all([loader1, loader2, loader3])
    .then(function(result1,result2,result3)) {
        ...

但这不是它的工作方式......所以我试过了

Promise
    .all([loader1, loader2, loader3])
    .then(function(result)) {
        // var result1 = result[0];
        // var result2 = result[1];
        // var result3 = result[1];

但是第二个的结果是函数而不是返回值...

搜索许多站点表明像 Q 和 bluebird 这样的 promise 系统有一个 spread 方法,这看起来像我想要的。我可以在普通的旧 javascript 中执行此操作吗(怎么做?)或者我应该考虑使用 Q 或 RSVP 这样的库来代替?

最佳答案

but the results of the second are the functions not the returned values ...

您没有从您构造的 Promise 中解析任何值。您也不会从链中后续的 .then 返回任何值。 您需要为每个加载程序函数执行以下操作:

function loader1() {

    var data = localforage.getItem("data1");
    
    data.then(function (data) {

        if (data !== null) {
             return data;
        } else {
            data = $.getJSON("/myapp/data1.json")

            if (data !== null) {
                return data;
            } else {
                return Error;
        }

    data.catch(function (err) {
       return (err);
    }

这确保对函数 loader1() 的调用将返回已解决的 Promise 或已拒绝的 Promise。然后您可以使用 guest271314 建议的解决方案:

Promise
.all([loader1(), loader2(), loader3()])
.then(function(result) {
  // var result1 = result[0];
  // var result2 = result[1];
  // var result3 = result[1];
 })
 .catch(function (err) {
   // problem
 });

但是请注意,Promise同步 执行的。这意味着它不会自动等待任何异步操作在 Promise 中完成。您必须自己解决这个问题,只有在异步操作完成后才解决它(通常通过解决传递给异步函数的回调)。

关于javascript - 收集多个 promise 结果? (纯javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40011662/

相关文章:

javascript - 尝试在 <canvas> 中显示 <a> 的文本内容而没有任何视觉差异

javascript - 放大/缩小 imagemap 后 Maphilight() 停止正常工作

javascript - 我正在阅读关于 promise 的 MDN 文档并想出了一个我无法理解的例子。任何人都可以向我解释流程

node.js - 从异步等待函数中获取 Bluebird Promise

javascript - document.write() 中到底发生了什么?

javascript - 使用 Google Apps 脚本进行 Stripe 付款

javascript - lambda.invoke 周围是否需要 promise 包装器?

javascript - 推送异步 Promise 时 Promise.all() 不成功

javascript - Async/Await - 使用对象映射功能进行 Promise

Angular:从 FileReader 返回 Observable/ES6 Promise