2016-05-14 20 views
0

我最近選擇了Node,發現事情並不總是按順序運行。我很困惑,我已經習慣了在Javascript中使用回調處理變量賦值?

1) Assignment 
2) Print data 

目前我正在下面的函數和調用var x = searchForProfessor("prof_name_here");

然後我打電話console.log(x);只拿到不確定的。

我一直在閱讀關於遍歷整個網絡的回調,我無法將我的頭圍繞這個想法並將其應用於此代碼。有人可以給我一些直覺,以回調做出上述可能嗎?

我的功能

var searchForProfessor = function searchForProfessor(teacher_name) { 

    google.resultsPerPage = 10 
    var nextCounter = 0 

    google(teacher_name, function (err, res){ 

    for (var i = 0; i < res.links.length; ++i) { 
     var link = res.links[i]; 
     if (!link.title.includes('Add') || !link.title.includes('RATINGS') || !link.title.includes("Hint")) { 

     request(link, function(err, resp, body){ 

      if (!err && resp.statusCode == 200) { //If no error is going to happen, then print the data 
      var $ = cheerio.load(body);   //Grab the body of data from 'prof_link' 
      var overall_rating = $('.breakdown-header .grade').text(); //Get the grade rating from the following classifications text 

      if (overall_rating.substr(0,3)) { 
       teacher_results.push(prof_name); 
      } //End if 
      } //End if 
     }); //End request 
     }//End if for comparisons || 
    } //End For 
    }); //End google function 
} //End searchForProfessor 

回答

2

因爲無論你googlerequest功能從這些函數返回的異步數據不會立即可用,這就是爲什麼x

var x = searchForProfessor("prof_name_here"); 

總會給你undefined時您嘗試記錄它。

爲緩解此問題,您可以將函數作爲參數傳遞給其他函數,以便在可用時返回該數據。

下面是關於如何使用回調函數的完整代碼的小示意圖。

async1模仿數據庫連接 - 它通過調用真實傳遞到它與數據作爲第一個參數的函數返回使用密鑰1秒一個對象。

function async1(name, callback) { 
    var obj = { tea001: { first: 'Dave', last: 'Batman' } }; 
    setTimeout(function() { 
    callback(obj[name]); 
    }, 1000); 
} 

這裏我們有你的searchForProfessor函數,它接受一個名字和一個函數。它使用名稱調用async1,並將回調作爲第二個參數傳入。請注意,返回的data是從async1返回的對象數據。使通入searchForProfessor回調來返回數據...

function searchForProfessor(teacher_name, callback) { 
    async1(teacher_name, function (data) { 
    callback(data); 
    }); 
} 

...這個函數調用searchForProfessor此時您可以登錄數據。

searchForProfessor('tea001', function (data) { 
    console.log(data); 
}); 

您可以在返回的數據大約需要一秒鐘演示中看到,一旦代碼運行記錄到控制檯。

DEMO