2016-01-25 58 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