为整个承诺对象渲染承诺值

时间:2015-01-09 20:17:24

标签: javascript asynchronous promise bluebird

我有很多这些函数,我想知道如何将它们全部归结为一个对象。它们都可以并行运行。是否有bluebird这样的内容可以促进这一点?

report.osx_serial = function(){
  return execAsync("ioreg -l | grep IOPlatformSerialNumber").spread(rmNewLines).then(rmSerial).catch(returnFalse);
}

report.osx_serial().then(console.log);

1 个答案:

答案 0 :(得分:1)

您可以创建一个类似于Promise.map的新函数,该函数适用于对象:

function promiseMapObject(obj) {
    var keys = Object.keys(obj);
    var promises = keys.map(function (key) {
        return obj[key];
    });

    return Promise.all(promises).then(function (results) {
        var resultObj = {};

        results.forEach(function (result, i) {
            resultObj[keys[i]] = result;
        });

        return resultObj;
    });
}

promseMapObject({
    serial: report.osx_serial(),
    …
}).done(console.log);

如果你有Lo-Dash便利,那就是zipObject

function promiseMapObject(obj) {
    var keys = Object.keys(obj);
    var promises = keys.map(function (key) {
        return obj[key];
    });

    return Promise.all(promises).then(function (results) {
        return _.zipObject(keys, results);
    });
}

甚至:

function promiseMapObject(obj) {
    var keys = Object.keys(obj);
    var promises = keys.map(function (key) {
        return obj[key];
    });

    return Promise.all(promises)
        .then(_.partial(_.zipObject, keys));
}