2015-07-22 4 views
0

Я изучаю node.js прямо сейчас, и у меня возникают проблемы с обращением.Node.js callbacks hell

Я посмотрел на Event Emitter, но это не похоже на меня.

Это то, что я звоню: «найдено»

exports.search = function(lat, lng, Arr, callback) { 

    //something 

    geocoder.reverse({ 
     lat: lat, 
     lon: lng 
    }, function(err, res, callback) { 

     //finding the area 
     if (area !== "null") { 
      pool.getConnection(function(err, connection, callback) { 
       if (err) { 

       } else { 
        connection.query("SOME SQL CODE", function(err, rows, fields, callback) { 
         if (found what Im looking 
          for) { 
          connection.query("SOME SQL CODE", function(err, rows, fields, callback) { //looking for something else 
           if (err) { 
            callback(true); 
           } else { 
            if (rows[0] === undefined) { 
             callback(true); 
            } else { 
             console.log("found!"); 
             callback(null, rows[0]); 
            } 
           } 
          }); 

         } else if (err) { 

         } 
        }); 
       } 
      }); 
     } else { 

     } 
    }); 
}; 

я получаю мой в журнале консоли, но обратный вызов не работает по какой-либо причине.

Если я поместил обратный вызов в конце функции «поиск», он перезвонит, знаю ли я, что у меня нет проблемы с функцией, которая получает обратный вызов.

Спасибо!

+0

Вы затирание своего 'callback' переменного на каждом уровне. – jmar777

+0

Кроме того, 'area' не определен нигде. – jmar777

+0

... и будет ли 'area' когда-либо фактически равным строке' "null" '? – jmar777

ответ

0

Я думаю, что обратный вызов (null, rows [0]) является обратным вызовом функции geocoder.reverse. Вы можете изменить обратный вызов имени функции поиска, это callback1, а затем вызвать, как показано ниже.

exports.search = function(lat, lng, Arr, callback1) { 

//something 

geocoder.reverse({ 
    lat: lat, 
    lon: lng 
}, function(err, res, callback) { 

    //finding the area 
    if (area !== "null") { 
     pool.getConnection(function(err, connection, callback) { 
      if (err) { 

      } else { 
       connection.query("SOME SQL CODE", function(err, rows, fields, callback) { 
        if (found what Im looking 
         for) { 
         connection.query("SOME SQL CODE", function(err, rows, fields, callback) { //looking for something else 
          if (err) { 
           callback(true); 
          } else { 
           if (rows[0] === undefined) { 
            callback(true); 
           } else { 
            console.log("found!"); 
            callback1(null, rows[0]); 
           } 
          } 
         }); 

        } else if (err) { 

        } 
       }); 
      } 
     }); 
    } else { 

    } 
}); 

};

Вы можете применить async lib к вашему коду, чтобы ваш код тоже был чист.

0

Это лучше использовать библиотеку, которая помогает вам: как async или q