возврат в функцию не возвращает но зависает - PullRequest
0 голосов
/ 09 июня 2019

В моем приложении 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?

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Это потому, что функция nexmo.message.sendSms выполняет функцию обратного вызова, поэтому вы можете попробовать определить универсальный метод sendSms и обернуть функцию nexmo.message.sendSms в обещание .После этого вы можете вызвать эту универсальную функцию, передать аргументы и вернуть ее внутри асинхронной функции sendVcode1 с ключевым словом await , чтобы она ожидала результата, как;

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)
   }
}
1 голос
/ 09 июня 2019

Ваш код sendVcode1 возвращает обещание, которое возвращается немедленно

nexmo.message.sendSms возвращает что-нибудь? Он получает обратный вызов в качестве своего последнего аргумента, если только эта функция не возвращает обещание, которое пересылает все, что возвращается внутри обратного вызова, вы не получите success / failed to send в своем внешнем обещании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...