2015-09-15 3 views
0

Прежде чем перейти к запросу, объект проблем определен, внутри запроса проблем он не определен. Я попробовал решение, упомянутое на сообщениях того же типа, но это не сработало. Комментарии в коде объясняют проблему далее.Как использовать объект асинхронно в Javascript?

var createIssues = function createIssues(rows, wrap) { 
    var issues = []; 

    for (var i = 0; i < rows.length; i++) { 

     // Processing code redacted 

     issues.push({ 
      id  : rows[i].id, 
      // Other field redacted 
     }); 


     // ISSUES OBJECT CORRECT HERE 
     console.log(JSON.stringify(issues[i])) 

     // Query comments for individual post 

     connection.query(
      "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id, 
      function (err, rows_comments) { 

       // ISSUES OBJECT UNDEFINED HERE 
       console.log(JSON.stringify(issues[i])) 

       // More code redacted 
      } 
     ) 
    } 

    return issues; 
} 

Я попытался передать его в качестве функции, подобно тому, как я нашел в объяснениях в Интернете, но теперь он говорит «TypeError: не определено не является функцией»

var createIssues = function createIssues(rows, wrap) { 

    var issues = []; // Create issues array 

    // Loop throug every issue that was 
    // returned by the SQL query. 
    for (var i = 0; i < rows.length; i++) { 

     // Redacted processing code 

     issues.push({ 
      id  : rows[i].id, 
      // Redacted extra fields 
     }); 

     (function(issues) { 

      connection.query(
       "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id, 
       function (err, rows_comments) { 

     // Can't access issues here, undefined 

       } 
      ) 

     })(issues); 

    } 

    return issues; 
} 
+1

Проблемы в том, 'я> rows.length' к тому времени запрос завершен – levi

+0

Что значит? Как это произойдет? – Connorelsea

+0

'i == rows.length' фактически – Hacketo

ответ

2

Проблема здесь вы передали весь массив вопросов в свой iif, а не только индивидуальный, что делает iife бессмысленным, потому что он не решает проблему, которую он должен решить.

(function(issue) { 

     connection.query(
      "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id, 
      function (err, rows_comments) { 

       // worky 

      } 
     ) 

    })(issues[i]); 

Тем не менее, вы можете полностью избежать этой проблемы, используя метод ForEach, который доступен для всех массивов. Если у вас есть массив, и вам нужно перебрать его с шагом 1, нет причин не использовать метод массива, а не цикл for.

var createIssues = function createIssues(rows, wrap) { 

    var issues = []; // Create issues array 

    // Loop throug every issue that was 
    // returned by the SQL query. 
    rows.forEach(function (row, index) { 

     // Redacted processing code 
     var issue = { 
      id  : row.id, 
      // Redacted extra fields 
     } 
     issues.push(issue); 

     connection.query(
      "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issue.id, 
      function (err, rows_comments) { 

       // worky 

      } 
     ) 
    }); 

    return issues; 
} 

Пожалуйста, обратите внимание, однако, что issues собирается быть возвращен вызывающей сферой, прежде всего асинхронной работы завершено, а это означает, что вы делаете вместо // worky комментария не будет принимать не влияет, пока через некоторое время.

+0

Итак, как бы я возвращал вопросы, когда у него есть вся информация? – Connorelsea

+1

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

+0

Тогда я не уверен, что смогу обернуть голову вокруг замены этой логики. хмм. Наверное, мне придется смотреть дальше. Хотя я попробую использовать forEach. – Connorelsea

0

Я думаю, что вы все еще будете иметь проблемы при возврате объекта issues, потому что вы изменяете его асинхронно. Для этого вопроса вы не имеете доступ к i в обратном вызове запроса, но строка вы возвращаете имеет тот же идентификатор, который должен быть достаточным для поиска:

connection.query(
     "SELECT C.id, C.elementID, C.googleID, C.time, C.body FROM comments C WHERE elementID = ? AND approved = 1", issues[i].id, 
     function (err, rows_comments) { 

      // ISSUES OBJECT UNDEFINED HERE 
      // console.log(JSON.stringify(issues[i])) //i is not what you expect here 
      console.log(JSON.stringify(issues[row_comments.id])); //the ID comes back in the query 

      // More code redacted 
     } 
    ) 
Смежные вопросы