Promise.all可以将[Promise a, Promise b]
转换为Promise [a, b]
,这非常有用,但也可以将{a: Promise a, b: Promise b}
转换为Promise {a, b}
。
用例是:
我有一个函数可以从网站加载一些文件,并在失败的情况下返回错误消息。
这意味着它的签名是information -> {values: values, messages: messages}
。
但是整个检查是异步的,所以结果是information -> {values: Promise values, messages: promise messages}
答案 0 :(得分:3)
这是我的超级简单解决方案:
export const objectZip = (keys, values) =>
keys.reduce(
(others, key, index) => ({
...others,
[key]: values[index],
}),
{}
);
export const objectPromise = async obj =>
objectZip(Object.keys(obj), await Promise.all(Object.values(obj)));
答案 1 :(得分:1)
你可以手动完成:
function objectPromise(obj) {
return Promise.all(Object.keys(obj).map(function (key) {
return Promise.resolve(obj[key]).then(function (val) {
return {key: key, val: val};
});
})).then(function (items) {
var result = {};
items.forEach(function (item) {
result[item.key] = item.val;
});
return result;
});
}
使用
var testObj = {
a: Promise.resolve("a"),
b: Promise.resolve("b"),
c: "c"
};
objectPromise(testObj).then(function (obj) {
console.log(obj);
});
//> { a: 'a', b: 'b', c: 'c' }
ES6语法中的相同内容,如果您愿意:
var objectPromise = obj => Promise.all(
Object
.keys(obj)
.map(key => Promise.resolve(obj[key]).then(val => ({key: key, val: val})))
).then(items => {
let result = {};
items.forEach(item => result[item.key] = item.val);
return result;
});
答案 2 :(得分:0)
尝试使用蓝鸟。它有一组辅助函数:你需要http://bluebirdjs.com/docs/api/promise.props.html
答案 3 :(得分:0)
不,因为我知道,但你可以准备一个返回物品,你会知道什么时候准备好了
function multipleAsyncJobs(){
ret = {};
var a = new Promise(function(resolve, reject){
ret.a = someVal; // set
resolve();
})
var b = new Promise(function(resolve, reject){
ret.b = someVal; // set
resolve();
})
return new Promise(function (resolve, reject) {
Promise.all([a,b]).then(function(){
resolve(ret)
})
})
}
你可以像这样使用这个func,以便像往常一样返回一个承诺
multipleAsyncJobs().then(ret=>{
console.log(ret.a)
})