Twilio Whatsapp: отправка нескольких мультимедийных сообщений - PullRequest
1 голос
/ 21 января 2020

Я пытаюсь l oop через массив для отправки нескольких сообщений в Twilio последовательно . Но в моем конечном выводе в Whatsapp порядок не является последовательным. Например, он отображается в следующем порядке: Изображение 2 -> Изображение 1 -> Изображение 3. Я пытался использовать библиотеку asyn c / await , но это не помогло.

Я пытался .reduce , а также обычный для l oop с await внутри l oop .

Массив:

str.text = ["Image 1", "Image 2", "Image 3"]
str.images = ["https://hatrabbits.com/wp-content/uploads/2017/01/random.jpg", "https://images.unsplash.com/photo-1494253109108-2e30c049369b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80", "https://www.computerhope.com/jargon/r/random-dice.jpg", ]

Код:

function sendMsg(img, txt) {
  context.getTwilioClient().messages.create({
    to: event.From,
    from: 'whatsapp:' + context.WHATSAPP_NUMBER,
    body: txt,
    mediaUrl: img
  }).then(message => {
    callback();
  }).catch(err => callback(err));
}

async function test(str) {
  (str.text).reduce(async (previousPromise, value, i) => {
      await previousPromise;
      return sendMsg(str.images[i], str.text[i])
  }, Promise.resolve());
}

request.post({
...
}, function (err, res, body) {

  var str = body.data.message;
  test(str);
}

Ответы [ 2 ]

0 голосов
/ 21 января 2020

var items = [
    {
        text: "Image 1",
        image: "https://hatrabbits.com/wp-content/uploads/2017/01/random.jpg"
    },
    {
        text: "Image 2",
        image: "https://images.unsplash.com/photo-1494253109108-2e30c049369b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80"
    },
    {
        text: "Image 3",
        image: "https://www.computerhope.com/jargon/r/random-dice.jpg"
    }
];

sendMessage(items);

function sendMessage(items) {

    // stop condition
    if (!items.length) {
        // return;
        callback(null, '');
    }

    const currentItem = items.shift();

    context.getTwilioClient().messages.create({
        to: event.From,
        from: 'whatsapp:' + context.WHATSAPP_NUMBER,
        body: currentItem.text,
        mediaUrl: currentItem.image
    })
        .then(message => {
            setTimeout(sendMessage, 1500, items);
        })
        .catch(err => {
            // return;
            callback(err, null);
        });


}


Если вам нужно больше времени между сообщениями, поиграйте с 1500 из setTimeout(sendMessage, 1500, items);.

0 голосов
/ 21 января 2020

Похоже, вы смешиваете обратный вызов, обещания без должного возврата вещей. Я бы изменил следующее

  • вернуть обещание от отправки msg
  • добавить await в ваш request.post
  • использовать for..of l oop для их обработки последовательно

как-то так

str.text = ["Image 1", "Image 2", "Image 3"]
str.images = ["https://hatrabbits.com/wp-content/uploads/2017/01/random.jpg", "https://images.unsplash.com/photo-1494253109108-2e30c049369b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&w=1000&q=80", "https://www.computerhope.com/jargon/r/random-dice.jpg"];

function sendMsg(img, txt) {
  return context.getTwilioClient().messages.create({
    to: event.From,
    from: 'whatsapp:' + context.WHATSAPP_NUMBER,
    body: txt,
    mediaUrl: img
  }).catch(err => console.log(err));
}

async function test(str) {
  for (const [index, value] of str.text) {
    await sendMsg(str.images[index], str.text[index]);
  }
}

request.post({
  ...
  }, async function (err, res, body) {

    var str = body.data.message;
    await test(str);
  }

...