如何解决过滤从Promise返回的数组
我正在移植以下代码:
function FindDevices() {
let ports = portLister.list();
let devices = []
for (port of ports) {
try {
device = new Device(port); // throws if not valid port
devices.push(device);
}
catch {
// log(port);
}
}
return FindDevices;
}
当前版本应使用SerialPort.list()
,其中returns a promise。
到目前为止,我尝试了以下方法,但没有成功:
const SerialPort = require('serialport');
async function FindDevices() {
const result = (await SerialPort.list()).filter(port => new Device(port));
return result;
}
FindDevices().then(devices => {
console.log(devices);
});
很明显,我还没有得到应该做的事情。所以问题是:我应该如何使用async / await或Promises来表示以前的FindDevices
函数的意图? 消费结果的一种好方法是什么?例如,如何获取第一个找到的设备?
解决方法
为什么不只是使用相同的功能,而是等待呢?
async function FindDevices() {
const ports = await SerialPort.list();
const devices = [];
for (let port of ports) {
try {
const device = new Device(port); // throws if not valid port
devices.push(device);
} catch {
// log(port);
}
}
return devices;
}
,
只需等待所有已执行操作的串行端口解析器,并在需要时使用您的设备解析Promise
function portListener() {
this.list = function() {
return Promise.resolve([80,443,4200,4300]);
}
}
class Device
{
constructor(port)
{
this.port = port;
}
}
async function FindDevices() {
var devices = [];
await new portListener().list().then(function(ports) {
for (port of ports) {
try {
device = new Device(port); // throws if not valid port
devices.push(device);
}
catch {
// log(port);
}
}
});
return Promise.resolve(devices);
}
FindDevices().then(function(devices) {
console.log(devices);
});
,
我认为您确实需要根据失败来过滤项目,因此您可以在mapper中添加catch块,然后过滤出结果
async function FindDevices() {
const ports = await SerialPort.list();
const results = ports.map(port => {
try {
return new Device(port)
} catch() {
return null
}
}).filter(port => !!port);
return results;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。