2014-07-30 13 views
0

до сих пор у меня не было больше проблем и я думал, что смогу немного обработать AngularJS.
Но теперь я попытался вернуть значение без каких-либо результатов.
Третья строка вызывает мою функцию для извлечения имени из базы данных. Но эта функция не возвращает результат.Как вернуть значение внутри функции другой функции?

$scope.showModal = function ($event,listId) { 
    console.log("showModal: "+$event.type+" - id: "+listId); 
    console.log("scope.listname: "+getListname(listId)); 
    $('#edit').modal('toggle'); 
}; 

function getListname(listId) { 
    var query = 'SELECT name FROM Lists WHERE id=(?)'; 
    $scope.db.transaction(
     function (transaction) { 
      transaction.executeSql(query, [listId], 
       function (tx, results) { 
        // console.log("Result: "+results.rows.item(0).name); // works! 
        return results.rows.item(0).name; // returns nothing or not to the sender 
       }      
      ); 
     } 
    ); 
} 

Если я использую console.log() в executeSql, я получаю значение в консоли. Но почему я не могу вернуть свой результат к вызывающей функции?

+0

См https://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

ответ

1
function getListname(listId) { 
    var query = 'SELECT name FROM Lists WHERE id=(?)'; 
    var deferred = $q.defer(); 
    transaction.executeSql(query, [listId], 
      function (tx, results) { 
       deferred.resolve(results.rows.item(0).name); 
      }      
    ); 
    return deferred.promise; 
    } 

Можно использовать, как это

getListname(listId).then(function(name){ 
    $scope.db.transaction = name; 
}); 
+0

Наконец-то! Спасибо! Он работает! Мне просто пришлось изменить $ scope.db.transaction на $ scope.listname. Моя проблема в том, что я пробовал это отсрочить, но в результате у меня появился объект [тогда , поймать, наконец] и не знал, что с ним делать. – Tipo

1

Вы должны использовать обещание, чтобы написать код синхронно, но выполнить его в async. https://docs.angularjs.org/api/ng/service/ $ д

+0

Эээ ... Я пытался избежать этого обещания. Раньше у меня всегда были проблемы с этим, потому что я действительно не понимаю, как его использовать или как его реализовать, например. к моим запросам. :-( – Tipo

+0

@Tipo: Хорошо, пора бы узнать больше об этом :) http://www.html5rocks.com/en/tutorials/es6/promises/ –

+0

Спасибо за эту ссылку. Я позабочусь о нем. – Tipo

0

Ваш запрос является асинхронным, так что вы должны справиться с обратным вызовом:

function getListname(listId, callback) { 
    var query = 'SELECT name FROM Lists WHERE id=(?)'; 
    $scope.db.transaction(
     function (transaction) { 
      transaction.executeSql(query, [listId], 
       function (tx, results) { 
       // console.log("Result: "+results.rows.item(0).name); // works! 
        callback(results.rows.item(0).name); // returns nothing or not to the sender 
       }      
      ); 
     } 
    ); 
} 
+0

Извините, но у меня есть ошибка. Я думаю, что «обратный вызов» - неизвестная функция. Ошибка: 'Uncaught TypeError: undefined не является функцией' – Tipo

+0

вы должны передать функцию обратного вызова в качестве параметра getListname следующим образом: getListName (listId, function (name) {у вас здесь есть переменная имен}); – karaxuna

+0

@Повторить вторую функцию, которую вы передадите, будет вызываться, когда операция запроса базы данных будет завершена. – karaxuna

2

Добро пожаловать в мир асинхронном! executeSql является асинхронной, поэтому используйте функцию обратного вызова для доступа к данным, как только эта функция завершает:

function getListname(listId, callback) { 
    var query = 'SELECT name FROM Lists WHERE id=(?)'; 
    $scope.db.transaction(
     function (transaction) { 
     transaction.executeSql(query, [listId], 
      function (tx, results) { 
       // console.log("Result: "+results.rows.item(0).name); // works! 
       callback(results.rows.item(0).name); // returns nothing or not to the sender 
      }      
     ); 
    } 
); 

А потом называют его!

getListName(listId, function(name) { 
    console.log(name); 
}); 
Смежные вопросы