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

Render out promise values for entire object of promises

我有一大堆这样的函数,我想知道如何将它们全部计算到一个对象中。他们都可以 运行 并行。 bluebird 中有什么东西可以促进这一点吗?

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

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

您可以创建一个类似于 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));
}