我想使用Promise.all
异步运行一些请求但我会得到一个密钥很重要的对象。我已将数组传递给Promise.all
,但是我可以传递一个对象,其中每个属性的值都是一个承诺吗?我可以通过密钥在当时的回调中访问结果吗?
我看了MDN docs,他们说要传递迭代,但只显示传入的数组的例子。
答案 0 :(得分:0)
这是我刚刚掀起的事情
Promise.allObject = function(obj) {
var keys = Object.keys(obj);
var promises = keys.map(function(key) { return obj[key]; });
return Promise.all(promises).then(function(data) {
return data.reduce(function(result, val, indx) {
result[keys[indx]] = val;
return result;
}, {});
});
};
这是一个适合我的测试
var dummy = function(v) {
return new Promise(function(resolve) {
setTimeout(resolve.bind(null, v), (Math.random() * 2000 + 2000) >>> 0);
});
};
Promise.allObject({
key1: dummy('a'),
key2: dummy('c'),
key3: dummy('b'),
key4: 'not a promise'
})
.then(console.log.bind(console))
.catch(console.error.bind(console));
大约4秒后(虚拟函数有一个随机超时)输出
Object { key1: "a", key2: "c", key3: "b", key4: "not a promise" }
有用?