Как хранить одни и те же данные в массиве несколько раз? - PullRequest
0 голосов
/ 01 мая 2019

Я получаю аудио URL и некоторый текст от this api.До сих пор я могу получить этот ответ в диалоговом потоке с помощью webhook.

Теперь мне нужно получить одни и те же данные несколько раз.Например, до сих пор, если я попрошу воспроизвести аудио , оно выдаст URL 1 раз .Теперь я хочу, чтобы он возвращал URL несколько раз , например, когда я прошу его воспроизвести аудио 2 раза или 100 раз, он должен дать URL соответственно.

URL-адреса должны храниться в массиве так же, как я это делаю.

Я помещаю объект, содержащий «url», «title» и «type», в массив с именем «messages».Надо толкать конкретно нет.раз я указываю, используя переменную 'times'.

Это то, что я уже пробовал.Пожалуйста, проверьте цикл, если он расположен правильно?Эта функция работает без цикла и возвращает данные один раз.Сообщите мне, если требуется какая-либо другая деталь.

Код

static readAyahOfSurahMultipleTimes = async (agent: any) => {


           const params = agent.parameters
           console.log("params: ", params)

           let surahApi: any = await http.get(`http://api.alquran.cloud/v1/ayah/${params.surahName}:${params.ayahNumber}/editions/ar.alafasy,en.asad`);

           var ayahs: any = surahApi["data"];  
           console.log("ayahs", ayahs);

           let payload = {
               "web": {     
                   "messages": []
               }
           }
           try {
               ayahs.forEach(function (item) {
                   for(var i=0;i<params.times;i++){
                   payload.web.messages.push({                              
                       "url": item.audio,
                      // "title": item.text,
                      "title": surahApi["data"][0]["text"],
                       "type": "audio",
                   }) 
                }
               });
               console.log("payload", payload);
               console.log("payload.web.messages",payload.web.messages);


               raw.response.send({

                   "fulfillmentText": `Ayah number ${params.ayahNumber} of surah number ${params.surahName} is being played`,   
                   "payload": payload
               })
               return;
           } catch (e) {
               console.log("error in catch block", e);
               raw.response.send({
                   "fulfillmentText": `response from catch`
               })
           }
       }

ОТВЕТ НА ВЫПОЛНЕНИЕ enter image description here

1 Ответ

1 голос
/ 02 мая 2019

Переменная ayahs - это массив, который содержит два объекта, и только первый объект содержит аудио-URL (попробуйте открыть http://api.alquran.cloud/v1/ayah/2:286/editions/ar.alafasy,en.asad в браузере, чтобы проверить ответ). В настоящее время вы просматриваете оба этих объекта и присоединяете звуковой URL-адрес обоих объектов к свойству url объектов массива. Причина, по которой это сработало только один раз, заключается в том, что звуковой URL-адрес существует только для первого объекта. первый цикл forEach и доступ к аудио через первый элемент массива ayahs.

static readAyahOfSurahMultipleTimes = async (agent: any) => {

     const params = agent.parameters

     let surahApi: any = await http.get(`http://api.alquran.cloud/v1/ayah/${params.surahName}:${params.ayahNumber}/editions/ar.alafasy,en.asad`);

     var ayahs: any = surahApi["data"];  


     let payload = {
        "web": {     
            "messages": []
        }
     }

     try {
        let ayah: any = ayahs[0];
        let audio:string = ayah.audio;

        for(var i=0; i<params.times; i++){
           payload.web.messages.push({                              
              "url": audio,
              "title": surahApi["data"][0]["text"],
              "type": "audio",
           }) 
        }          

        raw.response.send({
           "fulfillmentText": `Ayah number ${params.ayahNumber} of surah number ${params.surahName} is being played`,   
           "payload": payload
        })

        return;
     } 
     catch (e) {
       raw.response.send({
          "fulfillmentText": `response from catch`
        })
     }
  }

Теперь я думаю, что то, что вы делаете, копируя данные в массиве сообщений, бессмысленно, вы можете просто добавить свойство для количества повторений звука в объекте полезной нагрузки, а затем настроить его на клиент должен повторяться несколько раз с использованием этой переменной.

payload.web.messages.push({                              
   "url": audio,
   "title": surahApi["data"][0]["text"],
   "repititionTimes": params.times
   "type": "audio"
})

Таким образом, вам не придется использовать цикл, и вы не будете отправлять ненужную полезную нагрузку.

...