将回调转换为nexmo.message.sendSms的异步/等待?

时间:2019-04-24 05:31:26

标签: asynchronous nexmo

我的nodejs应用程序调用{​​{1}} API来发送SMS消息。这是API:

nexmo

在应用中,是

nexmo.message.sendSms(sender, recipient, message, options, callback);

有没有一种方法可以将其转换为如下所示的异步/等待结构:

const nexmo = new Nexmo({
                apiKey: "nexmoApiKey",
                apiSecret: "nexmoSecret"
            }, { debug: true });        

nexmo.message.sendSms(nexmo_sender_number, cell_country + to, message, {type: 'unicode'}, async (err, result) => {....});

消息发送成功后,我想将const {err, result} = nexmo.message.sendSms(nexmo_sender_number, cell_country + to, vcode, {type: 'unicode'}); if (err) {.....}; //then process result... 返回给父函数。

2 个答案:

答案 0 :(得分:1)

nexmo-node库目前仅支持回调。您将需要使用promisifybluebird之类的东西来将sendSms函数转换为promise,并对其使用async / await。这是一个使用Node Promisify的示例

const util = require('util');
const Nexmo = require('nexmo');

const nexmo = new Nexmo({
                apiKey: "nexmoApiKey",
                apiSecret: "nexmoSecret"
            }, { debug: true });        


const sendSms = util.promisify(nexmo.message.sendSms);

async function sendingSms() {
  const {err, result} = await sendSms(nexmo_sender_number, cell_country + to, message, {type: 'unicode'});
  if (err) {...} else { 
    // do something with result 
  }

}

答案 1 :(得分:0)

虽然亚历克斯的解决方案很优雅。它破坏了 TypeScript 并且 util 对 promise 做了一些“隐藏的逻辑”;当它出错时,堆栈跟踪不清楚。

这也让您能够忠于 API 并自动填充属性。

所以你可以这样做(TypeScript)

/**
 * Return the verification id needed.
 */
export const sendSMSCode = async (phoneNumber: string): Promise<string> => {

    const result = await new Promise(async (resolve: (value: RequestResponse) => void, reject: (value: VerifyError) => void) => {
        await nexmo.verify.request({
            number: phoneNumber,
            brand: `${Config.productName}`,
            code_length: 4
        }, (err, result) => {
            console.log(err ? err : result)
            if (err) {
                reject(err)
            }
            resolve(result)

        });
    })

    return result.request_id
}