首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何嵌套承诺(Promise.all to Promise.all)

如何嵌套承诺(Promise.all to Promise.all)
EN

Stack Overflow用户
提问于 2020-01-20 20:19:45
回答 1查看 97关注 0票数 1

考虑嵌套Promises的以下结构

代码语言:javascript
复制
const getData = async() => {

  const refs = [{
      name: "John33",
      age: 33
    },
    {
      name: "John34",
      age: 34
    },
    {
      name: "John35",
      age: 35
    },
    {
      name: "John36",
      age: 36
    }
  ];


  let source = [{
      name: "John30",
      age: "unknown"
    },
    {
      name: "John31",
      age: "unknown"
    },
    {
      name: "John32",
      age: "unknown"
    },
    {
      name: "John33",
      age: "unknown"
    },
    {
      name: "John34",
      age: "unknown"
    },
    {
      name: "John35",
      age: "unknown"
    }, {
      name: "John36",
      age: "unknown"
    },
    {
      name: "John37",
      age: "unknown"
    },
    {
      name: "John38",
      age: "unknown"
    },
    {
      name: "John39",
      age: "unknown"
    }
  ];

  const resolver = doc => {
    return new Promise(doc => {
      let clone = { ...doc
      };
      let found = refs.find(ref => {
        return ref.name === doc.name;
      });

      if (found) clone.age = found.age;
      return clone;
    });
  };

  let getRefs = (doc, refs) => {
    const promises = refs.map(r => {
      resolver(doc).then(result => {
        return result;
      });
    });

    return Promise.all(promises);
  };


  let getCursorData = (cursor, refs, data) => {
    const promises = cursor.forEach(doc => {
      console.log("Getting cursor for " + doc.name);
      let clone = { ...doc
      };

      return getRefs(clone, refs).then(result => {
        console.log("Getting refs for " + clone.name);
        data.push(result);
      });
      return;
    });

    return Promise.all(promises);
  };

  // Get data
  let data = [];
  await getCursorData(source, refs, data);

  console.log("Returned data: ");
  console.log(data);

  return data;
};

console.log("Begin");
getData().then(result => {
  console.log("End");
  console.log(result)
});

由于某些原因,我没有到达代码的末尾(End没有被打印)。我怀疑有一些位置或丢失的回报,但我被困在没有找到解决办法。

如何使此代码结构按预期工作,如下所示:

age)

  • Return

  • 迭代源(我的数据来自每个寄存器的数据库

  • ),应用引用更改(在本例中,用引用固定

来更改数据)。

此代码的预期结果是使用当前的承诺结构获得具有可用引用的原始数据(source):

代码语言:javascript
复制
[
      name: "John30",
      age: "unknown"
    },
    {
      name: "John31",
      age: "unknown"
    },
    {
      name: "John32",
      age: "unknown"
    },
    {
      name: "John33",
      age: 33
    },
    {
      name: "John34",
      age: 34
    },
    {
      name: "John35",
      age: 35
    }, {
      name: "John36",
      age: 36
    },
    {
      name: "John37",
      age: "unknown"
    },
    {
      name: "John38",
      age: "unknown"
    },
    {
      name: "John39",
      age: "unknown"
    }
]
EN

回答 1

Stack Overflow用户

发布于 2020-01-20 21:00:31

这就是你要的!

代码语言:javascript
复制
const SimulatedDatabaseCall = new Promise(resolve => {
	setTimeout(() => {
		resolve([
			{
				name: 'John33',
				age: 33
			},
			{
				name: 'John34',
				age: 34
			},
			{
				name: 'John35',
				age: 35
			},
			{
				name: 'John36',
				age: 36
			}
		]);
	}, 200);
});

let source = [
	{
		name: 'John30',
		age: 'unknown'
	},
	{
		name: 'John31',
		age: 'unknown'
	},
	{
		name: 'John32',
		age: 'unknown'
	},
	{
		name: 'John33',
		age: 'unknown'
	},
	{
		name: 'John34',
		age: 'unknown'
	},
	{
		name: 'John35',
		age: 'unknown'
	},
	{
		name: 'John36',
		age: 'unknown'
	},
	{
		name: 'John37',
		age: 'unknown'
	},
	{
		name: 'John38',
		age: 'unknown'
	},
	{
		name: 'John39',
		age: 'unknown'
	}
];

async function updateSource(source, SimulatedDatabaseCall) {
	await SimulatedDatabaseCall;
	SimulatedDatabaseCall.then(_database => {
		var sourceMap = source.map(_sourceOBJ => {
			return _sourceOBJ.name;
		});
		_database.forEach(_databaseOBJ => {
			var index = sourceMap.indexOf(_databaseOBJ.name);
			source[index].age = _databaseOBJ.age;
		});
	});

	return source;
}

updateSource(source, SimulatedDatabaseCall).then(_val => {
	console.log(_val);
});

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59830323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档