NodeJS异步函数返回的Promise未定义

时间:2018-01-14 00:50:25

标签: javascript node.js

当我调用sendText时,callSendAPI返回的promise返回为undefined,在控制台上记录如下:

  

从callSendAPI未定义的承诺返回

我已经阅读了promises并检查了很多堆栈溢出问题,但我无法掌握我的代码的哪一部分是错误的。消息发送正常,但未定义的返回会导致更高功能中的等待无法正常工作。

我在构建我的承诺时做错了什么导致它作为未定义返回?

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();
    });
  }
}

1 个答案:

答案 0 :(得分:0)

这是一个重写,简化了您的实现并使用值正确解析了承诺:

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()生成的承诺,而不是将其包装在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;
    });
  }
};