return in函数不返回而是挂起

时间:2019-06-08 22:20:47

标签: node.js express

在我的nodejs 10.16.0和express 4.16.4应用中,有一种方法sendVcode1发送SMS消息并以successfailed 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有什么问题?

2 个答案:

答案 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)
   }
}