Node.js 如何在nodejs中使用异步瀑布进行API调用
在我的应用程序中,我必须一步一步地执行一系列API调用。 我尝试使用异步瀑布选项来实现这一点,但在得到第一个API的响应之前,第二个函数正在执行,第二个函数中也发生了同样的事情。也就是说,在得到响应之前,最终结果是send。 如果我尝试执行一些API调用以外的任务,则瀑布操作将正常进行。 下面是我尝试过的代码。出于测试目的,从两个函数(myFirstFunction、mySecondFunction)调用相同的API 获得的产出Node.js 如何在nodejs中使用异步瀑布进行API调用,node.js,asynchronous,waterfall,Node.js,Asynchronous,Waterfall,在我的应用程序中,我必须一步一步地执行一系列API调用。 我尝试使用异步瀑布选项来实现这一点,但在得到第一个API的响应之前,第二个函数正在执行,第二个函数中也发生了同样的事情。也就是说,在得到响应之前,最终结果是send。 如果我尝试执行一些API调用以外的任务,则瀑布操作将正常进行。 下面是我尝试过的代码。出于测试目的,从两个函数(myFirstFunction、mySecondFunction)调用相同的API 获得的产出 F:\workSpace_Node\SampleApp>no
F:\workSpace_Node\SampleApp>node app.js
server running at 9086
------- myFirstFunction
First Function -->undefined
-------- mySecondFunction
Second Function -->{}
Result -->{}
Success REST Response: {"vehicleList":[{"make":"Audi","model":"A3","vin":"QVFCFQT7894563214"},{"make":"Audi","model":"A4","vin":"ASECFQT7894563214"},{"make":"Audi","model":"Q7"},{"make":"Audi","model":"Q5","vin":"QWECFQT7894993214"}]}
Success REST Response: {"vehicleList":[{"make":"Audi","model":"A3","vin":"QVFCFQT7894563214"},{"make":"Audi","model":"A4","vin":"ASECFQT7894563214"},{"make":"Audi","model":"Q7"},{"make":"Audi","model":"Q5","vin":"QWECFQT7894993214"}]}
如何使用async.瀑布实现这一点,或者是否有更好的方法满足这一需求。这是我使用承诺和异步函数的最佳方法 但是,如果您想在没有承诺的情况下实现它,我认为所有异步代码都应该得到一个回调参数 但是您的
callVehicle
没有回调参数,因此当callVehicle
得到响应时,无法通知父函数
const myFirstFunction = (callback) => {
callVehicle(callback);
}
const mySecondFunction = (vehList, callback) => {
const vehList1 = callVehicle((err, res) => callback (err, {
1: vehList,
2: res
}));
}
// We add callback that should be called when we have a result of the api request
const callVehicle = (callback) => {
var options = {
method: "GET",
json: true,
strictSSL: false,
url: `http://localhost:8080/vehicle/make`
};
request(options, function(error, response, body) {
if (!error && body){
console.log("Success REST Response: ", JSON.stringify(body));
callback(null, body)
} else {
console.log("Error : ", JSON.stringify(error));
callback({ Error: error }, null)
});
}
承诺:
const get = (options) => new Promise(
(resolve, reject) => request(
{method: 'GET', ...options},
(err, response, body)=> err ? reject(err) : resolve(body)
)
)
const callVehicle = () => get({
json: true,
strictSSL: false,
url: `http://localhost:8080/vehicle/make`
})
router.get('/', async (req, res) => {
try {
const firstVehicle = await callVehicle()
const secondVehicle = await callVehicle()
res.status(200).json("Success").end();
} (error) {
res.status(400).json(error).end();
}
});
const get = (options) => new Promise(
(resolve, reject) => request(
{method: 'GET', ...options},
(err, response, body)=> err ? reject(err) : resolve(body)
)
)
const callVehicle = () => get({
json: true,
strictSSL: false,
url: `http://localhost:8080/vehicle/make`
})
router.get('/', async (req, res) => {
try {
const firstVehicle = await callVehicle()
const secondVehicle = await callVehicle()
res.status(200).json("Success").end();
} (error) {
res.status(400).json(error).end();
}
});