Как вернуть карту значения ключа из вызова Promise в javascript? - PullRequest
1 голос
/ 26 апреля 2020

Привет, я новичок в NodeJs и Javascript. У меня есть требование вернуть значение ключа из вызова типа обещания. Я звоню в NodeJs модуль ping, где я хочу сделать асинхронный вызов для пинга IP-адресов, и я хочу сохранить IP-адрес в качестве ключа и достижимый статус в качестве значения на карте. Мой код работает, когда я могу печатать в консоли, но не могу вернуть карту. Я приведу ниже код. Пожалуйста, помогите мне, потому что я поражен.

import { FileUtil } from "./util/file-util";
import ping = require("ping");

export class Test1 {

    public async pingManyIPAddress(): Promise<Map<string, boolean>> {
        let map: Map<string, boolean> = new Map();

        let fileUtil = new FileUtil();
        const fileNamePath: string = "testData/ipaddress-50.txt";
        const allIPs: string[] = await fileUtil.readFileLineByLineNonBlocking(fileNamePath);

        let cfg = {
            timeout: 10 // Timeout in seconds
        };

        allIPs.forEach(ip => {
            ping.promise.probe(ip, cfg).then((data: any) => {
                let ipAdrs = ip;
                let status = data.alive;
                console.log(ip,":",status); //Prints all IP and reachable status
                map.set(ip, status);
            });
        });

        // How to wait till the above promise line gets completely executed

        return Promise.resolve(map);
    }

    public async justCheck(): Promise<void> {
        let map: Map<string, boolean> = await this.pingManyIPAddress();        

        for (let key of Object.keys(map)) {
            console.log(key + " <-> " + map.get(key));//It does not print
        }
    }

}

let test2 = new Test1();
test2.justCheck();

Пожалуйста, помогите мне узнать, чтобы я мог изменить приведенный выше код, чтобы вернуть карту.

1 Ответ

1 голос
/ 26 апреля 2020

Ваша функция pingManyIPAddress не ждет, пока у нее есть данные. Он настроит несколько вызовов ping.promise.probe, но затем он немедленно перейдет и вернет Promise.resolve(map). На данный момент карта пуста, поэтому любой код, который пытается использовать карту сразу, ничего не видит в ней.

Вместо этого вам нужно подождать, пока эти индивидуальные обещания не будут выполнены. Вы можете сделать это, сделав массив обещаний и объединив их в одно обещание с Promise.all, а затем ожидая этого.

public async pingManyIPAddress(): Promise<Map<string, boolean>> {
    let map: Map<string, boolean> = new Map();

    let fileUtil = new FileUtil();
    const fileNamePath: string = "testData/ipaddress-50.txt";
    const allIPs: string[] = await fileUtil.readFileLineByLineNonBlocking(fileNamePath);

    let cfg = {
        timeout: 10 // Timeout in seconds
    };

    const promises = allIPs.map(ip => {
        return ping.promise.probe(ip, cfg).then((data: any) => {
            let ipAdrs = ip;
            let status = data.alive;
            console.log(ip,":",status); //Prints all IP and reachable status
            map.set(ip, status);
        });
    });

    await Promise.all(promises);

    return map;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...