Promise.all for Javascript中的对象

时间:2017-05-18 14:20:49

标签: javascript asynchronous promise

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}

4 个答案:

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