promise使用数组值映射对象数组

时间:2016-05-21 10:52:10

标签: javascript arrays promise bluebird

在迭代承诺时有点迷失,我试图改变这个:

[{
 ' site' : ['url', 'url', 'url']
},
{
 ' site' : ['url', 'url', 'url']
}]

这样就变成了:

[{
'site' : [{ 'url' : result_of_function }, { 'url' : result_of_function }, { 'url' : result_of_function }]
},
{
  'site' : [{ 'url' : result_of_function }, { 'url' : result_of_function }, { 'url' : result_of_function }]
}]

到目前为止,我创建了下面的函数,但由于某种原因,没有调用checkBranding。

function searchPageArray(brand, siteObjArr) {

    return Promise.map(siteObjArr, function(sitesObj){

    var k = Object.keys(sitesObj)[0]
    var urlArr = sitesObj[k];

    return Promise.map(urlArr, function(url){

        return searchPage(url).then(function(html){

            var tempObj = {}

            tempObj[url] = checkBranding(url, html, brand)

            return tempObj

            })
        })

    return sitesObj;

})

}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用bluebird.jsprops()方法。

// You must use bluebird to achieve this
var Promise = require('bluebird');

function searchPageArray(brand, siteObjArr) {

    return Promise.map(siteObjArr, function (sitesObj) {

        var k = Object.keys(sitesObj)[0]    
        var urlArr = sitesObj[k];

        return Promise.map(urlArr, function (url) {

            return searchPage(url)
                .then(function (html) {
                    // Use promise.props(). It resolves all properties of a 
                    // object before returning. If there are any properties that
                    // arent promises they are returned as normal.
                    return Promise.props({
                        url: checkBranding(url, html, brand) // Assuming checkBranding() returns a promise.
                    });
                });
        });

        return sitesObj;

    });
}