2016-01-25 2 views
-1

Я пытаюсь получить одно значение из таблицы Google Fusion, но у меня возникают проблемы с этим из-за асинхронного характера вызова. Есть идеи, как это сделать? Вот то, что я пытался до сих пор:Return Одно значение из таблицы 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) возвращает значение с секцией функции (ответа), но не при возврате значения. Например, значение var = getVal(); // Возвращает undefined – eniacAvenger

ответ

1

Я отвечу на вопрос, который вы просили в комментариях, как это более ясно, и я предполагаю, что это проблема, которую вы хотите решить.

Используйте Javascript Promise для обработки таких вызовов Async. (Обзор 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'); 
} 

Ваш пример должен выглядит что-то похожее на this-

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

Смежные вопросы