当我调用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();
});
}
}
答案 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;
});
}
};