Возвращенный массив имеет неопределенное значение - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь вернуть массив через async / await:

        app.get('/users/article/feed',checkAuthenticated,async (request,response)=>{
           try{
             function executor(){
                let articleArray=[]

                const sql="SELECT noOfArticles FROM Articles WHERE id=?"
                db.query(sql,[request.user.id], (err,result)=>{
                  if(err) throw err
                  let noOfArticles=result[0].noOfArticles
                   for(let i=1;i<=noOfArticles;i++){
                     const sql1="SELECT ?? FROM Articles WHERE id=?"
                     let index='article'+i
                     db.query(sql1,[index,request.user.id],(err,result)=>{
                       if(err) throw err
                       articleArray.push(result[0][index])
                       if(articleArray.length===noOfArticles){
                         console.log(articleArray);      //here the array is printed as expected
                         return articleArray;
                  }
             })

            }

           })
          }
          const resultArray= await executor();
          console.log(resultArray);            //here the array is undefined
          response.render('viewArticles');

    }    catch(e){
          console.log(e);
      }

     })

ResultArray всегда не определен. Я знаю, что это очень старый вопрос. Я пробовал проверить все остальные ответы в Stack Overflow, но меня это сильно смущает. Я новичок с ie по js, поэтому я не мог правильно его понять. Как я могу это решить?

Ответы [ 3 ]

1 голос
/ 28 мая 2020

Вы возвращаетесь изнутри функции обратного вызова, которая не будет работать, так как executor не ждет ответов на ваши запросы. Вместо этого верните обещание.

function executor() {
    return new Promise((resolve,reject) => {
        let articleArray = [];

        const sql = "SELECT noOfArticles FROM Articles WHERE id=?";
        db.query(sql, [request.user.id], (err, result) => {
            if (err) return reject(err);
            let noOfArticles = result[0].noOfArticles;
            for (let i = 1; i <= noOfArticles; i++) {
                const sql1 = "SELECT ?? FROM Articles WHERE id=?";
                let index = "article" + i;
                db.query(sql1, [index, request.user.id], (err, result) => {
                    if (err) return reject(err);
                    articleArray.push(result[0][index]);
                    if (articleArray.length === noOfArticles) {
                        console.log(articleArray); //here the array is printed as expected
                        return resolve(articleArray);
                    }
                });
            }
        });
    })
}
0 голосов
/ 28 мая 2020

Когда вы возвращаете articleArray, вы не возвращаете его из функции-исполнителя. Вместо этого вы возвращаете его из обратного вызова, который передается в функцию db.query. Синтаксис () => {} в основном является сокращением для function() {} (хотя есть различия, которые выходят за рамки этого ответа).

Возможно, что-то подобное может быть полезно (обратите внимание, что я удалил try catch, поскольку Я считаю, что такое ведение журнала должно выполняться на уровне промежуточного программного обеспечения в express, который, похоже, вы используете):

app.get('/users/article/feed', checkAuthenticated, async (request, response) => {
    return new Promise((resolve, reject) => {
        let articleArray = []

        const sql = "SELECT noOfArticles FROM Articles WHERE id=?"
        db.query(sql, [request.user.id], (err, result) => {
            if (err) reject(err)
            let noOfArticles = result[0].noOfArticles
            for (let i = 1; i <= noOfArticles; i++) {
                const sql1 = "SELECT ?? FROM Articles WHERE id=?"
                let index = 'article' + i
                db.query(sql1, [index, request.user.id], (err, result) => {
                    if (err) reject(err); // reject the promise if there is an error
                    articleArray.push(result[0][index])
                    if (articleArray.length === noOfArticles) {
                        console.log(articleArray);
                        resolve(articleArray); // resolve the promise with the value we want
                    }
                })
            }
        })
    })
})
0 голосов
/ 28 мая 2020

Возвращает ли он какой-то результат, если вы делаете вызываемую функцию asyn c?

async function executor(){
            let articleArray=[]

            const sql="SELECT noOfArticles FROM Articles WHERE id=?"
            db.query(sql,[request.user.id], (err,result)=>{
              if(err) throw err
              let noOfArticles=result[0].noOfArticles
               for(let i=1;i<=noOfArticles;i++){
                 const sql1="SELECT ?? FROM Articles WHERE id=?"
                 let index='article'+i
                 db.query(sql1,[index,request.user.id],(err,result)=>{
                   if(err) throw err
                   articleArray.push(result[0][index])
                   if(articleArray.length===noOfArticles){
                     console.log(articleArray);      //here the array is printed as expected
                     return articleArray;
              }
         })

        }

       })
      }
...