【问题标题】:Passing parameters to imported function in Node.js将参数传递给 Node.js 中的导入函数
【发布时间】:2018-07-03 11:35:30
【问题描述】:

我觉得这应该不难,但我是 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 文件?

【问题讨论】:

  • 您还可以将async 函数转换为返回promise,并将Promise.all 用于函数的所有输出以达到相同的结果。
  • 谢谢@BrijeshPatel...如果我这样做了,我将不再需要async.js 依赖项,对吧?

标签: javascript node.js express async.js


【解决方案1】:

a tutorial I found online 看来,您需要将mobikespin 函数包装在其他函数中,以便将您的数据与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);
});

【讨论】:

    【解决方案2】:

    对于并行方法,每个函数只有一个回调参数。

    实现你想要的最简单的方法就是这样

    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);
    });
    

    【讨论】:

    • 我将 Aldo 的答案标记为正确,因为这是第一次回复,但感谢您的回复(本来会同样有效)
    【解决方案3】:

    您也可以使用绑定来传递参数。示例:

    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 ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2018-04-29
      • 2019-06-05
      • 2016-08-07
      相关资源
      最近更新 更多