Promise.all可迭代参数

时间:2015-10-16 22:27:30

标签: javascript promise

我想使用Promise.all异步运行一些请求但我会得到一个密钥很重要的对象。我已将数组传递给Promise.all,但是我可以传递一个对象,其中每个属性的值都是一个承诺吗?我可以通过密钥在当时的回调中访问结果吗? 我看了MDN docs,他们说要传递迭代,但只显示传入的数组的例子。

1 个答案:

答案 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" }

有用?