2015-12-10 4 views
0
a = ["1","2","3"] 
    square = (i,cb)-> 
    i = parseInt(i) 
    setTimeout()->cb null,i*i,100 
    for i in a 
    square i,(err,result)-> 
     console.log i + " " + result 

    output: 
    3 1 
    3 4 
    3 9 
    expected: 
    1 1 
    2 4 
    3 9 

если удалить setTimeout Я могу получить ожидаемый результат.переменная javascript, измененная в async обратном вызове

или написать как этот

for i in a 
     ((i)-> 
     square i,(err,result)-> 
      console.log i + " " + result 
    )(i) 

Является ли это ошибка Javascript?

+0

Является ли это Java-код? вы можете создать скрипку http://jsfiddle.net? – gurvinder372

+0

Что это? CoffeeScript, машинопись? Это не JavaScript. – Andy

+0

Этот вывод не является ошибкой, как работает async. К моменту запуска ваших вызовов таймаута цикл for уже завершен. Поэтому 'i' содержит последнее значение, используемое в цикле, в этом случае 3, поэтому каждый раз выводится 3. –

ответ

0

Вот тот же код в реальной JavaScript, что дает тот же результат (и скрипка: http://jsfiddle.net/99obrntp/)

var a = ['1','2','3']; 

function square(i, cb){ 
    i = parseInt(i); 
    setTimeout(function(){ 
     cb(null, i*i); 
    }, 100); 
} 

for(var i=0; i<a.length; i++){ 
    var value = a[i]; 
    square(value, function(err, result){ 
     console.log(value, result); 
    }); 
} 

Теперь квадрат результат, очевидно, правильно, но проблема заключается в вашем призыв к console.log(). Причина в том, что обратный вызов не будет вызываться в первый раз, пока цикл не завершится (из-за setTimeout). Другими словами, value становится 3, прежде чем консоль будет записана в первый раз. Чтобы исправить это, вам нужно передать значение до вашего обратного вызова. Например:

var a = ['1','2','3']; 

function square(i, cb){ 
    i = parseInt(i); 
    setTimeout(function(){ 
     cb(null, i*i, i); 
    }, 100); 
} 

for(var i=0; i<a.length; i++){ 
    var value = a[i]; 
    square(value, function(err, result, initial){ 
     console.log(initial, result); 
    }); 
} 

Update скрипкой: http://jsfiddle.net/3sdjgzv1/

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