2016-01-25 55 views
-1

我試圖從Google Fusion表中檢索單個值,但由於調用的異步性質而遇到問題。任何想法如何做到這一點?以下是我迄今爲止嘗試:從Google Fusion表中返回單個值

function getVal() { 
    var queryText = encodeURIComponent(query); 

    var gvizQuery = new google.visualization.Query(
     'http://www.google.com/fusiontables/gvizdata?tq=' + queryText); 

     gvizQuery.send(function (response) { 
       var dt = response.getDataTable() 
       alert(dt.getValue(0, 0)); // Works, returns a value 

       return dt.getValue(0, 0); 
    }); 

var value = getVal(); // Undefined 
+0

我很抱歉,但是,我的問題是如何異步性影響你返回一個單一的值?你的意思是'dt.getValue(0,0)'返回undefined? – bozzmob

+0

更加清楚的是,dt.getValue(0,0)返回的是函數(response)部分的值,但不是當我返回值時。如var value = getVal(); //返回undefined – eniacAvenger

回答

1

我會回答你問我的意見,因爲這是更清楚的,我想這就是你正在尋找解決問題的問題。

使用Javascript Promise來處理這種異步呼叫。 (JS promise的概述)。

一個承諾將幫助你等待迴應,然後做相同的操作。

一個示例 -

if (window.Promise) { 
    console.log('Promise found'); 

    var promise = new Promise(function(resolve, reject) { 
    var request = new XMLHttpRequest(); 

    request.open('GET', 'http://api.icndb.com/jokes/random'); 
    request.onload = function() { 
     if (request.status == 200) { 
     resolve(request.response); // we got data here, so resolve the Promise 
     } else { 
     reject(Error(request.statusText)); // status is not 200 OK, so reject 
     } 
    }; 

    request.onerror = function() { 
     reject(Error('Error fetching data.')); // error occurred, reject the Promise 
    }; 

    request.send(); //send the request 
    }); 

    console.log('Asynchronous request made.'); 

    promise.then(function(data) { 
    console.log('Got data! Promise fulfilled.'); 
    document.getElementsByTagName('body')[0].textContent = JSON.parse(data).value.joke; 
    }, function(error) { 
    console.log('Promise rejected.'); 
    console.log(error.message); 
    }); 
} else { 
    console.log('Promise not available'); 
} 

你的榜樣應該看起來類似的東西到這個 -

function getVal() { 
    var promise = new Promise(function(resolve, reject) { 
    var queryText = encodeURIComponent(query); 

    var gvizQuery = new google.visualization.Query(
     'http://www.google.com/fusiontables/gvizdata?tq=' + queryText); 

     gvizQuery.send(function (response) { 
       var dt = response.getDataTable() 

       resolve(dt.getValue(0, 0)); 
    }); 
    reject(false); 
    } 
} 
var value = getVal(); 

請閱讀JavaScript的承諾,它會幫助你很多。

+0

非常感謝你,我一直在研究這樣做的許多不同方式,而且我無法圍繞處理響應的問題。 – eniacAvenger

+1

很高興知道它有幫助! :)快樂的編碼! – bozzmob