2017-03-10 39 views
1

我正在編寫一個getWebContent函數,它使用Promise(我也使用Request模塊)返回網頁的內容。使用Promise對象返回一個函數的值

我想使用此功能的方法是VAR含量= getWebContent(),使內容變量包含請求的網站的數據。我開始如下:

var request = require('request') 
 

 
var getWebContent = function() { 
 
    
 
    target = 'http://www.google.com'; 
 
    var result = null; 
 
    var get = function (url) { 
 
     return new Promise(function (resolve, reject) { 
 
      function reqCallback(err, res, body) { 
 
       if (err) reject(err); 
 
       else resolve(body); 
 
      }; 
 
      request(url, reqCallback); 
 
     }); 
 
    }; 
 

 
    get(target).then(function (res) { 
 
     result = res; 
 
     console.log(res); 
 
    }); 
 
    
 
    return result; 
 
}; 
 

 
var goog = getWebContent(); 
 
console.log(goog)

但是,此代碼不能正常工作,因爲該函數返回結果變量,該變量爲空,無極對象被解決之前。你能不能讓我知道我應該如何修復我的代碼,以便它按預期工作?

+0

@JLRishe我正在學習這個Web應用程序,因爲我是新手。我不知道你爲什麼如此諷刺,但我不相信他們是爲了好玩而做的。我正確回答你的問題嗎? – noclew

+0

@JLRishe謝謝您的參考。 – noclew

回答

2

無論如何你需要使用Promise。您不能在Javascript中使用異步操作創建同步結果。

var request = require('request') 

var getWebContent = function() { 

    target = 'http://www.google.com'; 
    var result = null; 
    var get = function (url) { 
     return new Promise(function (resolve, reject) { 
      function reqCallback(err, res, body) { 
       if (err) reject(err); 
       else resolve(body); 
      }; 
      request(url, reqCallback); 
     }); 
    }; 

    return get(target); 
}; 

var goog = getWebContent().then(function (res) { 
    console.log(goog); 
}); 
+0

我明白了。那麼,一旦我開始承諾,我是否總是不得不使用Promise鏈?另外,在修改過的代碼中,是否有辦法將內容分配到goog變量,即var goog = ? – noclew

+1

你可以使用回調,但它不是很酷。還有其他一些方法來處理異步代碼,如異步,但是是的...一旦你啓動了Promise,你需要用Promise鏈來完成它;) – hya

+0

想這樣:在JavaScript中,你不能破壞它,一旦你承諾: D –