2015-11-30 6 views
0

У меня возникла проблема с областью javascript/порядком выполнения. Я создаю пустой объект внутри функции. Затем я добавляю некоторые свойства в дочернюю функцию. Однако свойства не изменились в родительской функции.Область действия функции/порядок выполнения Javascript

$scope.finder = function (obj) { 

    var id = obj.oid; 

    var crit = MC.Criteria('_ownerUserOid == ?', [id]); 

    theResult = {}; // Scope should be finder function. 

    database.findOne(crit) // This is a Monaca method for finding from database 

    .done(function(result) { 
     // Returns and empty object as expected. 
     console.log(JSON.stringify(theResult)); 

     theResult = result; 

     // Returns the search result object as again expected. 
     console.log(JSON.stringify(theResult)); 
    }); 



// Here's the issue - when I log and return theResult, I get an empty object again. 
// I think it has to do something with the scope. 
// Also, this logs to console before either of the console.logs in the done function. 

    console.log(JSON.stringify(theResult)); 
    return theResult; 


}; 
+2

К тому времени функция ребенка заканчивается, журнал консоли уже выполнено, поэтому «theResult» печатает пустые в этой строке. –

+0

Вы забыли 'var'. Поэтому переменная 'theResult' является глобальной. – Pointy

+0

Вам необходимо прочитать * асинхронные * запросы. – tymeJV

ответ

0

Похоже, что вы выполняете асинхронный запрос для некоторых данных. Каждый раз, когда вы выполняете асинхронный JavaScript, вам нужно иметь в виду, что вещи не называются последовательно. Когда выполняется асинхронный вызов, JavaScript будет продолжать выполнять код в стеке.

В вашем случае, theResult будет пустой объект, потому что database.findOne(crit) не закончил выполняться по времени, когда вы звоните console.log(JSON.stringify(theResult));

Из-за этого, вы не можете вернуться из $scope.finder, вместо того, чтобы вы могли передать функцию обратного вызова в $scope.finder и выполнить что однажды database.findOne(crit) закончил выполнение.

$scope.finder = function (obj, callback) { 

    var id = obj.oid; 

    var crit = MC.Criteria('_ownerUserOid == ?', [id]); 

    theResult = {}; // Scope should be finder function. 

    database.findOne(crit) // This is a Monaca method for finding from database 

     .done(function(result) { 
      // Returns and empty object as expected. 
      console.log(JSON.stringify(theResult)); 

      theResult = result; 

      callback(theResult); 

      // Returns the search result object as again expected. 
      console.log(JSON.stringify(theResult)); 
     }); 
}; 

Затем назовите его вот так.

$scope.finder({some: 'data'}, function(response) { 
    // response now has the values of theResult 
    console.log(response) 
}); 
1

Я думаю, что вы забыли «вар», прежде чем объявить переменную

var theResult = {} 
0

Изменить его к этому:

$scope.finder = function (obj) { 
    return database.findOne(MC.Criteria('_ownerUserOid == ?', [obj.oid]));   
}; 

// Client code: 
finder({ oid: 'foo' }) 
    .then(function(result) { console.log(JSON.stringify(result)); });