2016-12-01 82 views
-1

我正在使用bluebird & lodash并试图弄清楚如何在迭代对象后返回承诺?例如,我想添加一个键/值对每个对象,我想打印结果后,再为其添加一个键/值对每个对象:如何在javascript中迭代对象后返回承诺

var cars = { 
     audi:[ 
      { 
       model:'r8', 
       year:'2012' 
      }, 
      { 
       model:'rs5', 
       year:'2013' 
      } 
     ], 
     ford:[ 
      { 
       model:'mustang', 
       year:'2012' 
      }, 
      { 
       model:'fusion', 
       year:'2015' 
      } 
     ], 
     kia:[ 
      { 
       model:'optima', 
       year:'2012' 
      } 
     ] 
    } 

    _.forOwn(cars, function(value, key) { 
    key.processed = true; 
    }).then(function(cars) { 
    //print modified cars object here 
    console.log(cars); 
    }); 

有人能帮忙吗?

在此先感谢!

+3

'_.forOwn'是同步 - 摆脱'.then(功能(汽车){'和最后的'});' - 等voilà - 没有承诺需要 –

+0

以前的评论者说,尝试从简单的迭代返回承诺没有任何好处,它不是异步的 - 它的运行速度与javascript引擎可以执行的速度一样快。但是,如果你所说的是,迭代需要启动一系列异步的进程,那么这与你实际询问的那个完全不同。在这种情况下,你可以做一些'map'来返回promise数组(每个元素都有一个),然后在每次promise后返回,检查它是否是最后一个,并且发出'done'的承诺。 – ErikE

+0

所以要确认 - '_.forOwn'总是会在'console.log(cars)'之前完成。 @ErikE在对象上做“地图”工作吗?我以为'map'只适用于阵列... –

回答

1

一般来说,你可以做这样的事情(注:没有lodash,因为我不使用lodash,但表现出来的概念应该适应lodash)

function someAsyncFunction(car) { 
    return new Promise(function(resolve) { 
     setTimeout(function() { 
      car.processed = true; 
      resolve(car); 
     }, 1000 * Math.random() + 1000); 
    }); 
} 

Promise.all(Object.keys(cars).map(function(key) { 
    return someAsyncFunction(cars[key]); 
})).then(function(results) { // results will be an array of the values resolved in the promises 
    console.log(cars); 
});