Node.js和Express:在响应HTTP请求之前等待异步操作

亚力山大

假设有一个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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章