node.js - 在第一次 api 调用返回数据后进行第二次 api 调用
问题描述
我有两个单独的函数,它们使用 BlueBirdPromise 对不同的端点进行 API 调用以返回 JSON 数据。
const searchVenues = (type) => {
logger.debug('getVenues : type = ' + type);
const config = {
url: urlAPIServer + '/venue/available',
qs: {
type,
},
headers: {
'x-api-key': dataApiKey
}
};
return new BluebirdPromise((resolve, reject) => {
request.get(config, (err, response, body) => {
if (err) {
console.error(err);
reject(err);
} else {
resolve(JSON.parse(body));
}
});
});
};
const getVenuesWithCuisine = () => {
logger.debug('getVenuesWithCuisine');
const config = {
url: urlAPIServer + '/venue/viewvenuewithcuisine',
headers: {
'x-api-key': dataApiKey
}
};
return new BluebirdPromise((resolve, reject) => {
request.get(config, (err, response, body) => {
if (err) {
console.error(err);
reject(err);
} else {
resolve(JSON.parse(body));
}
});
});
};
分别调用函数以从 API 获取数据并将其绑定到变量。
searchVenues(venueType).then((venues) => {
checkContextTimeout(context);
conversationContext.venueType = venueType;
conversationContext.venues = venues;
context.skill = conversationContext;
});
getVenuesWithCuisine().then((venueswithcuisines) => {
conversationContext.venue_details = venueswithcuisines[0}["venue_details"];
conversationContext.cuisines = venueswithcuisines[1]["cuisines"];
conversationContext.venueType = venueType;
conversationContext.venues = venuesJson.venues;
continueConversation(request, response, context);
});
上述实现的问题是,如果由于某种原因 getVenuesWithCuisine 在 searchVenues 之前首先完成,则 continueConversation 将调用 conversationContext.venues = venues
设为 null。
如何使这些 API 调用同步,以便仅在第一个 API 返回数据后进行第二个 API 调用。
解决方案
您可以使用 Promise.all 而不是同步进行。一旦你的两个承诺都解决并给你结果,这将解决。 http://bluebirdjs.com/docs/api/promise.all.html
Promise.all([searchVenues(venueType), getVenuesWithCuisine()]).then(function([venueResp, cuisineResp]) {
...
});
推荐阅读
- mongodb - MongoDb 使用多个嵌套数组对文档进行排序
- laravel - Laravel 护照 / 允许客人使用 api 路由 / 绕过 Laravel api 中间件
- python-3.x - TypeError:“按钮”对象不可调用(pynput)
- java - Junit测试用例未使用maven运行
- go - UnhandledPromiseRejectionWarning:错误:nonce 生成函数失败或私钥在 Ganache 中无效
- python-3.x - 当我单击关闭然后再次单击运行时,我收到此错误“RuntimeError:线程只能启动一次”
- c# - 如何使用 Excel 互操作保存启用宏的工作簿 (xlsm)?
- c# - C#从数组中删除一个数字
- openedge - 使用参数的方法时出现运行时错误
- d3.js - 条形图中的分类标签部分隐藏