簡體   English   中英

Node.js和Express:在響應HTTP請求之前等待異步操作

[英]Node.js and Express: wait for asynchronous operation before responding to HTTP request

假設有一個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_執行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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM