假设有一个HTTP GET回调定义为:
router.get('/latestpost', function(req, res, next) {
var data = new FbData();
get_latest_post (data);
get_post_image (data);
res.json(data);
};
这两个get_
函数都使用fb包来生成HTTP请求并在完成后执行回调。如何修改上面的GET回调以等待来自Facebook的响应,然后才将响应发送给客户端?
当时,我通过依次执行get_
函数并将res
参数(响应)传递给它们来解决问题,最后一个函数发送响应:
router.get('/latestpost', function(req, res, next) {
var data = new FbData();
get_latest_post (res, data);
};
function get_latest_post (res, data) {
FB.api(_url, function (res_fb) {
if(!res_fb || res_fb.error) {
console.log(!res_fb ? 'error occurred' : res_fb.error);
return;
}
// Do stuff with data
get_post_image (res, data);
});
}
function get_post_image (res, data) {
FB.api(_url, function (res_fb) {
if(!res_fb || res_fb.error) {
console.log(!res_fb ? 'error occurred' : res_fb.error);
return;
}
// Do stuff with data
/* At the end send the post data to the client */
res.json(data);
});
}
我发现了一个类似的问题,但由于无法找到将解决方案应用于我的问题的正确方法,因此我将头衔缠住了。我已经尝试使用本手册中介绍的模式,但是无法使用promises或async / await来执行它。有人能指出我正确的方向吗?
您的API可以轻松修改以返回承诺:
function get_post_image (res, data) {
return new Promise((resolve, reject) => {
FB.api(_url, function (res_fb) {
if(!res_fb || res_fb.error) {
reject(res_fb && res_fb.error);
} else resolve(res_fb/*?*/);
});
}
现在您有了一个承诺,您可以等待它:
router.get('/latestpost', async function(req, res, next) {
const data = new FbData();
const image = await get_post_image (data);
res.json(data);
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句