我觉得这应该不难,但是我是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(1234,1234)
),它不起作用。如何将lat和lng参数传递给mobike.js文件?
答案 0 :(得分:1)
对于并行方法,每个函数仅具有一个回调参数。
实现所需目标的最简单方法就是这样
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);
});
答案 1 :(得分:1)
在a tutorial I found online中,您似乎需要将mobike
和spin
函数包装在其他函数中,以便将数据与{{ 1}}模块。像这样:
async
答案 2 :(得分:0)
您还可以使用bind来传递参数。示例:
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 ]