Передача параметров в импортированную функцию в Node.js - PullRequest
0 голосов
/ 03 июля 2018

Я чувствую, что это не должно быть сложно, но я новичок в Node.js (а также плохо знаком со многими аспектами JavaScript). Я создаю приложение Express, которое возвращает массивы мест для велосипедов, которые выбираются из нескольких API; каждый API требует ввода долготы и широты. Поэтому я разбил каждый вызов API на «модуль» и использую библиотеку npm «async» для параллельного выполнения каждого вызова, а также «axios» для выполнения запросов API. Я могу заставить его работать нормально, не разбивая его на модули, но как только я разделяю каждый вызов API в отдельный файл, я не могу понять, как передать в него значения lat и lng.

Вот мой index.js

import async from 'async';
import {mobike} from './mobike.js';
import {spin} from './spin.js';

async.parallel([
    mobike, //How or where can I pass these parameters?
    spin
],
function(err, results) {
    console.log(results);
});

а вот мой модуль mobike.js, например (для краткости опущу spin.js)

import axios from 'axios';

export var mobike = function (lat, lng, callback){
  axios.get('https://mwx.mobike.com/mobike-api/rent/nearbyBikesInfo.do', {
    params: {
      latitude: lat, //35.2286324
      longitude: lng //-80.8427562
    },
    headers: {
      'content-type': 'application/x-www-form-urlencoded',
      'user-agent': 'Mozilla/5.0'
    }
  }).then( response => {
      callback(null, response.data.object)
  }).catch(error => {
      callback(error, null)
  })
}

Когда я пытаюсь передать аргументы через mobike (например, mobike(1234,1234)), это не работает. Как передать аргументы lat и lng в файл mobike.js?

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Из учебника, который я нашел в Интернете , похоже, вам нужно обернуть свои mobike и spin функции внутри других функций, чтобы связать ваши данные вместе с функцией обратного вызова, предоставляемой async модуль. Как то так:

var lat = 35.2286324;
var lng = -80.8427562;

async.parallel([
    function(callback) { mobike(lat, lng, callback); },
    function(callback) { spin(lat, lng, callback); },
],
function(err, results) {
    console.log(results);
});
0 голосов
/ 03 июля 2018

Вы также можете использовать связывание для передачи параметров. Пример:

const async = require('async')

const sleep = (ms = 0) => {
  return new Promise(resolve => setTimeout(resolve, ms))
}

async.parallel([
    mobike.bind(null, 1000), //How or where can I pass these parameters?
    spin.bind(null, 500)
],
function(err, results) {
    console.log(results);
})

async function mobike (ms) {
  await sleep(ms) // pretend to wait for an api request
  console.log('mobike waited for ' + ms + ' ms')
  return ms
}

async function spin (ms) {
  await sleep(ms) // pretend to wait for an api request
  console.log('spin waited for ' + ms + ' ms')
  return ms
}

Результаты:

spin waited for 500 ms
mobike waited for 1000 ms
[ 1000, 500 ]
0 голосов
/ 03 июля 2018

Для параллельного метода каждая функция имеет только параметр обратного вызова.

Самый простой способ достичь желаемого - вот так

async.parallel([
    function (callback) {
        var lng = 0.0
        var lat = 0.0
        mobike(lat, lng, callback), //This is where you pass in parameters
    },
    spin
],
function(err, results) {
    console.log(results);
});
...