簡體   English   中英

未定義NodeJS Async函數返回的承諾

[英]Promise returned by NodeJS Async function is undefined

當我調用sendText時,callSendAPI返回的promise將返回未定義狀態,並按如下所示登錄控制台:

從callSendAPI返回的承諾未定義

我已經閱讀了Promise,並檢查了很多堆棧溢出問題,但是我無法掌握代碼的哪一部分是錯誤的。 該消息可以正常發送,但是未定義的返回結果會導致更​​高功能中的等待無法正常工作。

在構造我的諾言而導致它返回未定義狀態時,我做錯了什么?

var request = require('request-promise-native');

module.exports = {
  callSendAPI : function (sender_psid,response) {
    return new Promise(async function(resolve,reject) {
      // Construct the message body
      let request_body = {
        "recipient": {
          "id": sender_psid
        },
        "message": response
      }
      // Send the HTTP request to the Messenger Platform
      try {
        var a  = await request({
          "uri": "https://graph.facebook.com/v2.6/me/messages",
          "qs": { "access_token": PAGE_ACCESS_TOKEN },
          "method": "POST",
          "json": request_body
        })
      } catch(e) {
        console.error("Unable to send message:" + e);
        return reject(e);
      }
      console.log('message sent!')
      resolve();
    });
  },
  sendText : function(sender_psid,text) {
    return new Promise(async function(resolve,reject) {
      var response = { "text": `${text}` };
      try {
        var a = await module.exports.callSendAPI(sender_psid,response);
        console.log("Promise return from callSendAPI " + a);
      } catch(e) {
        console.error(e);
        return reject();
      }
      console.log("message sent--------------------");
      resolve();
    });
  }
}

這是一個重寫,可以簡化您的實現並使用值正確解析promise:

var request = require('request-promise-native');

module.exports = {
  async callSendAPI (sender_psid, response) {
    // Construct the message body
    let request_body = {
      recipient: {
        id: sender_psid
      },
      message: response
    };
    // Send the HTTP request to the Messenger Platform
    try {
      var a = await request({
        uri: "https://graph.facebook.com/v2.6/me/messages",
        qs: { access_token: PAGE_ACCESS_TOKEN },
        method: "POST",
        json: request_body
      });
      console.log('message sent!');
      return a;
    } catch(e) {
      console.error("Unable to send message:" + e);
      throw e;
    }
  },
  async sendText (sender_psid, text) {
    var response = { text: String(text) };
    try {
      var a = await module.exports.callSendAPI(sender_psid,response);
      console.log("Promise return from callSendAPI " + a);
      console.log("message sent--------------------");
      return a;
    } catch(e) {
      console.error(e);
      throw e;
    }
  }
};

正如@ jfriend00所建議的那樣,您可以簡單地返回由request()生成的promise,而不是將其包裝在try-catch中,可以選擇通過鏈接.then()記錄每個場景,如下所示:

var request = require('request-promise-native');

module.exports = {
  async callSendAPI (sender_psid, response) {
    // Construct the message body
    let request_body = {
      recipient: {
        id: sender_psid
      },
      message: response
    };

    // Send the HTTP request to the Messenger Platform
    return request({
      uri: 'https://graph.facebook.com/v2.6/me/messages',
      qs: { access_token: PAGE_ACCESS_TOKEN },
      method: 'POST',
      json: request_body
    }).then(value => {
      console.log('message sent!');

      return value;
    }, error => {
      console.error('Unable to send message:', error);

      throw error;
    });
  },
  async sendText (sender_psid, text) {
    var response = { text: String(text) };

    return module.exports.callSendAPI(sender_psid, response).then(value => {
      console.log('Promise return from callSendAPI', value);
      console.log('message sent--------------------');

      return value;
    }, error => {
      console.error(error);

      throw error;
    });
  }
};

暫無
暫無

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

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