Как я могу выполнить аргументы командной строки в сценарии node.js - PullRequest
0 голосов
/ 28 мая 2020

Я новичок в программировании и пытаюсь приложить усилия - вероятно, этот вопрос не стоит задавать, но с тех пор я не добился никаких успехов ... слишком долго.

Я пытаюсь это сделать поиск на всех устройствах, подключенных к моей локальной сети, в сценарии node.js.

Я нашел этот модуль npm, который должен выполнять эту работу: https://www.npmjs.com/package/local-devices/v/3.0.0

Поэтому я просто попытался скопировать и вставить пример, который они дали для поиска в моем сеть для всех устройств:

const find = require('local-devices');

// Find all local network devices.
find().then(devices => {
  devices /*
  [
    { name: '?', ip: '192.168.0.10', mac: '...' },
    { name: '...', ip: '192.168.0.17', mac: '...' },
    { name: '...', ip: '192.168.0.21', mac: '...' },
    { name: '...', ip: '192.168.0.22', mac: '...' }
  ]
  */
})

Но если я запускаю скрипт сейчас, ничего не происходит.

То, что я пробовал до сих пор: 1. Я попытался сохранить вывод в константе и попытался вывести это на консоль

const found = find().then(devices => {
    devices 
    /*[
      { name: '?', ip: '192.168.0.10', mac: '...' },
      { name: '...', ip: '192.168.0.17', mac: '...' },
      { name: '...', ip: '192.168.0.21', mac: '...' },
      { name: '...', ip: '192.168.0.22', mac: '...' }
    ]
    return devices
  })
  console.log(found);

, тогда консольный вывод будет Promise { <pending> }. Я пока не мог понять, что с этим делать.

есть этот аргумент командной строки arp -a, который, если он выполняется в командной строке, перечисляет все IP-адреса всех устройств в сети в терминале. Таким образом, он в основном делает именно то, что я хочу, но мне нужно работать с этим выводом в следующем коде (мне нужно найти один конкретный c IP-адрес умной вилки из этого списка, но это другая история).

Как я могу взять этот аргумент командной строки и выполнить его в моем javascript коде / моем node.js скрипте и сохранить результат в переменной / const?

С уважением, Михаил

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Когда функция возвращает Promise, это означает, что она работает асинхронно (в Интернете есть различные руководства по этому поводу). Короче говоря, функция find() немедленно вернется с объектом Promise, а затем будет go и найдет IP-адреса, и как только он найдет его, он заполнит Promise (т.е. fulfill it) .

Часть then() - это обратный вызов, который должен выполняться после выполнения обещания. Итак, что вы можете сделать:

const find = require('local-devices');

async function findIP() {
  // Find all local network devices.
  const found = find().then(devices => {
    console.log(devices);
  })

  await found;
}

findIP();

По сути, await говорит JS ждать, пока объект found Promise не будет выполнен - ​​прямо сейчас JS просто завершается до IP-адресов найдены.

0 голосов
/ 28 мая 2020

Проблема, с которой вы столкнулись, очень распространена в мире JS. Я постараюсь объяснить вам это изо всех сил. Это называется параллелизмом и, говоря очень простым языком, означает, что два или более процесса (или потока) выполняются вместе, но не одновременно. Одновременно выполняется только один процесс.

Еще проще: это означает, что код внутри обратного вызова then откладывается на время, когда CPU свободен.

Что вы видите при печати found объект - это Promise { <pending> }. Это объект, который представляет окончательное завершение (или отказ) асинхронной операции и ее результирующее значение. Он позволяет связывать обработчики / обратные вызовы с возможным значением успеха или причиной сбоя асинхронного действия. Это позволяет асинхронным методам возвращать значения, как синхронные методы: вместо того, чтобы немедленно возвращать окончательное значение, асинхронный метод возвращает обещание предоставить значение в какой-то момент в будущем.

Но почему нас это волнует? Вы могли бы сказать. Это потому, что вы просто можете думать о функции find как о «линейной» операции. Вы должны представить, что передаете какой-то обратный вызов (через then), который будет выполнен, как только он найдет все локальные сетевые устройства.

Таким образом, вы можете переписать свой код следующим образом:

const find = require('local-devices');

// Find all local network devices.
find().then(devices => {
  console.log(devices) /*
  [
    { name: '?', ip: '192.168.0.10', mac: '...' },
    { name: '...', ip: '192.168.0.17', mac: '...' },
    { name: '...', ip: '192.168.0.21', mac: '...' },
    { name: '...', ip: '192.168.0.22', mac: '...' }
  ]
  */
})

Но что, если вы хотите избежать ада обратных вызовов

Ну, JavaScript предлагает async и await ключевых слов, которые помогут вам в этом. Это просто причудливый способ скрыть / обработать обратные вызовы.

Во-первых, нам нужно быть внутри функции async, это требование использовать await. В приведенном ниже примере я буду использовать самозапускающуюся функцию, чтобы сделать вещи удобнее. Затем мы можем использовать await, чтобы получить результат от функции find:

(async () => {
  const find = require('local-devices');

  // Find all local network devices.
  const devices = await find()

  console.log(devices)
})()
0 голосов
/ 28 мая 2020

Конечно стоит спросить! JS может быть запутанным языком для изучения.

Если функция возвращает Promise (как это делает find), то регистрация того, что она возвращает, обычно не очень полезна. Обещание - это то, что в какой-то момент сможет потенциально дать какое-то полезное значение.

Часть .then вашей функции - это то место, где вы можете использовать значение, которое обещание содержит. Promise запустит функцию, содержащуюся в .then, как только вернет значение. Таким образом, выполнение чего-то вроде:

const find = require('local-devices');

// Find all local network devices.
find().then(devices => {
  console.log(devices);
})

Означает, что, когда функция, которая находит устройства, вернула значение, она зарегистрирует это значение.

...