我有一个类似结构的数组,它公开了异步方法。异步方法调用返回数组结构,从而返回更多异步方法。我正在创建另一个JSON对象来存储从该结构获得的值,因此我需要注意跟踪回调中的引用。
我已经编写了一个蛮力解决方案,但是我想学习一个更惯用或干净的解决方案。
- 对于n级嵌套,该模式应该是可重复的。
- 我需要使用promise.all或其他类似的技术来确定何时解析封闭例程。
- 并非每个元素都必然涉及进行异步调用。因此,在嵌套promise.all中,我不能仅基于索引对我的JSON数组元素进行分配。不过,我确实需要在嵌套的forEach中使用诸如promise.all之类的内容,以确保在解析封闭例程之前已进行了所有属性分配。
- 我正在使用bluebird promise lib,但这不是必需的
这是一些部分代码-
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
这是指向我要改进的工作源的链接。 github.com/pebanfield/change-view-service/blob/master/src/...
—
user3205931
我在示例中看到您正在使用bluebird,在这种情况下,bluebird实际上使(并发)和(顺序)使您的生活更加轻松,还不建议使用-我的答案中的代码显示了如何通过返回 promise 来避免这种情况。承诺都是关于返回值的。
—
本杰明·格伦鲍姆
Promise.map
Promise.each
Promise.defer