如何将JavaScript Promise的返回结果写入函数外部的对象
实现方案
- 你定义的
results是对象类型,push是数组专属方法,不能直接在对象上调用,直接用键名赋值即可写入内容 serverStatus返回的是Promise异步任务,需要等待所有请求执行完成后才能拿到完整的结果集
修改后可直接运行的代码
const ping = require('ping'); const results = {}; // 存储最终结果的对象 const ips = { server1: '8.8.4.4', server2: '1.103.1.1', server3: '8.8.8.8', }; const serverStatus = (hosts) => { return new Promise((resolve, reject) => { ping.sys.probe(hosts, function (isAlive) { const msg = isAlive ? `host ${hosts} is alive` : `host ${hosts} is dead`; resolve(msg); }); }); }; const getStatus = async (ips) => { // 收集所有ping异步任务 const taskList = Object.entries(ips).map(async ([key, value]) => { const status = await serverStatus(value); // 按服务器名作为key写入结果对象 results[key] = status; console.log(status); }) // 等待所有ping任务执行完成 await Promise.all(taskList); // 此处可获取完整的results结果 console.log('写入完成的results对象:', results); }; getStatus(ips);
运行输出示例
host 8.8.4.4 is alive host 8.8.8.8 is alive host 1.103.1.1 is dead 写入完成的results对象: { server1: 'host 8.8.4.4 is alive', server3: 'host 8.8.8.8 is alive', server2: 'host 1.103.1.1 is dead' }
如果偏好不用async/await语法,也可以在每个serverStatus的then回调中直接给results赋值,只是要使用完整结果时,仍然需要通过Promise.all的回调来处理后续逻辑,避免拿到未完成赋值的空对象。
内容的提问来源于stack exchange,提问作者Gregor Wedlich
相关产品推荐
相关产品推荐

