2015-06-07 6 views
0

У меня проблема с закрытием с обратным вызовом.Проблема закрытия с обратным вызовом

каждый раз, когда я называю эту функцию я понимаю, что tmp равен 1. и я устанавливаю его в обратном вызове ..

почему это происходит? и как я могу его решить?

var tmp = 1; 

var getConnection = function() { 

    console.log(tmp); 

    MongoClient.connect(url, function(err, db) { 
     tmp = 2; 
    }); 
}; 
+1

Как вы называете эту функцию? Это похоже на классический асинхронный вопрос. Вы обновляете глобальную переменную из асинхронного обратного вызова ... проблемы. – elclanrs

ответ

0
var tmp = 1; // set tmp to 1 

var getConnection = function() { 

    console.log(tmp); // log current value of tmp 

    MongoClient.connect(url, function(err, db) { 
     tmp = 2; // set tmp to 2 
    }); 
}; 

Я не вижу getConnection() называют, но давайте предположим, что вы называете это сразу после объявления.

Что происходит в getConnection() это вы 1) журнал текущее значение tmp, затем 2) пытаются подключиться к Монго, а затем 3) установить значение tmp до 2.

0

Я думаю, что некоторые данные отсутствуют в чтобы ответить на ваш вопрос.

Моя догадка заключается в том, что вы вызываете функцию getConnection() в какой-либо петле, например.

for (var i = 0; i < l; ++i) { 
    getConnection(i); 
} 

В этом случае последовательный код (т.е. цикл и console.log(tmp)) будет выполняться до всех обратных вызовов, в вашем случае:

function(err, db) { 
    tmp = 2; // set tmp to 2 
} 

«1» всегда будет представлен, потому что значение будет обновлено до «2» только после было написано на консоль.

0

MongoClient.connect операция асинхронной так, если вы хотите использовать обновленное значение tmp вы должны сделать что-то вроде:

var tmp = 1; // set tmp to 1 

var getConnection = function(callback) { 
    var ctx = this; //or whatewever you want the context to be 
    console.log(tmp); // log current value of tmp 

    MongoClient.connect(url, function(err, db) { 
    tmp = 2; // set tmp to 2 
    callback.call(ctx, tmp); //you have to choose the context 
    }); 
}; 

getConnection(function(tmp){ 
    //do some magic with tmp 
}) 

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

+0

Что здесь означает переменная 'ctx'? Кажется, он нигде не определен. – fraxture

+0

есть комментарий, который указывает, что вам нужно выбрать контекст 'ctx', который вы хотите. – steo

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