簡體   English   中英

如何處理回調 function 中響應的異步?

[英]How do I deal with async for a response in a callback function?

我正在使用這個package 作為 API 包裝器與無服務器 function 中的 CampaignMonitor API 進行交互。目的是向無服務器 function 的調用方返回響應,確認向 CampaignMonitor 添加訂閱者的操作是否成功.

這是我到目前為止所擁有的:

 exports.handler = async (event, context) => { const body = JSON.parse(event.body); // set request details const listId = process.env.CM_LIST_ID; const details = body; // Send Request and check for error returned api.subscribers.addSubscriber(listId, details, (err, res) => { if (err) { return { statusCode: 400, body: JSON.stringify({ message: err }), }; } else { return { statusCode: 200, body: JSON.stringify({ message: 'success' }), }; } }); };

不幸的是,這行不通,我認為是因為沒有等待對發送請求的最后部分的響應。 我有點不確定如何處理它,它是一個回調 function。

我已經使用這段代碼一段時間了,如果沒有錯誤,訂閱者將被添加到訂閱者列表中,並且當第二個返回語句在回調之外時,無服務器 function 返回成功響應(下面 api.subscribers.addSubscriber)。

在下面找到 async-await 的工作實現:

exports.handler = async (event, context) => {
  try
  {
      const body = JSON.parse(event.body);

      // set request details
      const listId = process.env.CM_LIST_ID;
      const details = body;
    
      const result = await api.subscribers.addSubscriber(listId, details);
      return {
        statusCode: 200,
        body: JSON.stringify({ message: 'success' }),
      };
  }
  catch(err){
      return {
      statusCode: 400,
      body: JSON.stringify({ message: err }),
    };
  }
};

問題

從 api.subscribers.addSubscriber 的回調api.subscribers.addSubscriber返回值不會使其成為包裝handler function 的返回值。

解決方案

由於您使用的庫不提供基於承諾的 API,您可以圍繞它創建一個 promise 包裝器並使用它來獲得所需的結果。

在 nodeJS 中創建 promise 包裝器的最簡單方法是使用內置的util模塊。

const util = require("util");

const promisifedAddSubscriber = util.promisify(api.subscribers.addSubscriber);

一旦你有了基於 promise 的api.subscribers.addSubscriber function,你就可以await這個 function 的調用。

exports.handler = async (event, context) => {
  try {
    ...

    // explicitly bind "this"
    const result = await promisifedAddSubscriber.bind(api.subscribers)(listId, details);
  
    return {
      statusCode: 200,
      body: JSON.stringify({ message: 'success' }),
    };
  }
  catch (error) {
    return {
      statusCode: 400,
      body: JSON.stringify({ message: error }),
    };
  }
};

您需要從check_saved_url返回Promise 在 Promise 內部,您需要使用resolve來替換return 如果出現錯誤,您也可以使用reject(new Error("error"))

您可以在MDN上閱讀更多關於承諾的信息

 exports.handler = async(event, context) => { return new Promise((resolve, reject) => { const body = JSON.parse(event.body); // set request details const listId = process.env.CM_LIST_ID; const details = body; // Send Request and check for error returned api.subscribers.addSubscriber(listId, details, (err, res) => { if (err) { reject(new Error({ statusCode: 400, body: JSON.stringify({ message: err }) })); } else { resolve({ statusCode: 200, body: JSON.stringify({ message: 'success' }) }); } }); }); };

暫無
暫無

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

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