收集多个承诺结果? (纯 javascript)
gathering multiple promise results? (plain javascript)
我是 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 这样的承诺系统有一个 spread
方法,这看起来像我想要的。我可以用普通的旧 javascript 来做到这一点吗(怎么做?)或者我应该看看使用像 Q 或 RSVP 这样的库来代替吗?
调用函数
Promise
.all([loader1(), loader2(), loader3()])
.then(function(result) {
// var result1 = result[0];
// var result2 = result[1];
// var result3 = result[1];
})
.catch(function (err) {
// problem
});
另见 How to cache a downloaded javascript fle which is downloaded using script tag
您可以使用 :
Promise.all([loader1(), loader2(), loader3()])
.then(function([result1, result2, result3]) {
...
but the results of the second are the functions not the returned
values ...
您没有解析您构造的 Promise
中的任何值。您也没有 returning 链中后续 .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() 的调用将 return 解决 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
内完成。你必须自己处理这个问题,只有在异步操作完成后才解决它(通常通过解决传递给异步函数的回调)。
我是 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 这样的承诺系统有一个 spread
方法,这看起来像我想要的。我可以用普通的旧 javascript 来做到这一点吗(怎么做?)或者我应该看看使用像 Q 或 RSVP 这样的库来代替吗?
调用函数
Promise
.all([loader1(), loader2(), loader3()])
.then(function(result) {
// var result1 = result[0];
// var result2 = result[1];
// var result3 = result[1];
})
.catch(function (err) {
// problem
});
另见 How to cache a downloaded javascript fle which is downloaded using script tag
您可以使用
Promise.all([loader1(), loader2(), loader3()])
.then(function([result1, result2, result3]) {
...
but the results of the second are the functions not the returned values ...
您没有解析您构造的 Promise
中的任何值。您也没有 returning 链中后续 .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() 的调用将 return 解决 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
内完成。你必须自己处理这个问题,只有在异步操作完成后才解决它(通常通过解决传递给异步函数的回调)。