在我的nodejs 10.16.0和express 4.16.4应用中,有一种方法sendVcode1
发送SMS消息并以success
或failed to send
返回:
sendVcode1:async function(vcode, cell, cell_country_code) {
switch(process.env.sms) {
case "nexmo" :
const nexmo = new Nexmo({
apiKey: process.env.nexmoApiKey,
apiSecret: process.env.nexmoApiSecret
}, { debug: true });
nexmo.message.sendSms(process.env.nexmo_sender_number, cell_country_code + cell, vcode, {type: 'unicode'}, async (err, result) => {
console.log("vcode in nexmo : ", vcode);
if(err){
console.error("Vcode failed to send : ", err.message);
return 'failed to send';
}else{
console.log("successfully sent vcode");
return 'success';
}
});
};
},
这是上面方法的调用代码:
const result = await helper.sendVcode1(vcode, user.cell, user.cell_country_code)
console.log("code send result : ", result);
if(result === 'success') {...}
如果方法sendVcode
返回,则应该有控制台输出code send result ...
。但是在控制台输出中,该应用程序在方法successfully sent vcode
中的sendVcode1
之后挂起,没有任何其他变化。看来return "success"
再也没有回来。方法sendVcode1
有什么问题?
答案 0 :(得分:1)
您的sendVcode1
代码返回一个立即返回的诺言
nexmo.message.sendSms
返回什么吗?它会收到一个回调作为最后一个参数,除非该函数返回一个承诺,该承诺将转发在回调内部返回的内容,否则您的外部承诺中将不会获得success
/ failed to send
。
答案 1 :(得分:1)
这是因为 nexmo.message.sendSms 函数执行回调函数,因此您可以尝试定义一个名为sendSms的通用方法,并将 nexmo.message.sendSms 函数包装在其中承诺。之后,您可以调用该泛型函数,传递参数并使用 await 关键字将其返回到sendVcode1异步函数中,这样它将等待结果,例如;
function sendSms(nexmo, vcode, user.cell, user.cell_country_code){
return new Promise(resolve => {
nexmo.message.sendSms(process.env.nexmo_sender_number, cell_country_code + cell, vcode, {type: 'unicode'}, async (err, result) => {
console.log("vcode in nexmo : ", vcode);
if(err){
console.error("Vcode failed to send : ", err.message);
resolve('failed to send');
}else{
console.log("successfully sent vcode");
resolve('success');
}
});
});
}
sendVcode1:async function(vcode, cell, cell_country_code) {
switch(process.env.sms) {
case "nexmo" :
const nexmo = new Nexmo({
apiKey: process.env.nexmoApiKey,
apiSecret: process.env.nexmoApiSecret
}, { debug: true });
return await sendSms(nexmo, vcode, cell, cell_country_code)
}
}