【问题标题】:Render out promise values for entire object of promises呈现整个承诺对象的承诺值
【发布时间】:2015-01-10 04:26:10
【问题描述】:

我有一大堆这些函数,我想知道如何将它们全部赋值给一个对象。它们都可以并行运行。 bluebird 中是否有一些东西可以促进这一点?

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

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

【问题讨论】:

    标签: javascript asynchronous promise bluebird


    【解决方案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));
    }
    

    【讨论】:

    • 我不认为 .all() 接受一系列承诺 github.com/petkaantonov/bluebird/blob/master/… :/
    • @ThomasReggi:第一句话是“Given an array ... which contains promises”
    • 嗯,控制台日志对我来说是所有功能,而不是承诺值。
    • props 看起来和你写的完全一样。
    • @ThomasReggi:确实如此。我完全错过了您使用的是蓝鸟。用那个! (这或多或少是基于 ES6 标准承诺的实现。)
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2015-10-06
    • 2018-06-23
    • 2017-07-18
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多