2015-01-27 2 views
-1

Может ли кто-нибудь помочь мне понять, какую ошибку я делаю? Или помочь мне дать альтернативное решение для того же?обновление внешнего объекта области в функции самозапускания в стороне?

http://jsfiddle.net/mrrajesh1982/eynpu8rj/2/

function isValidImageUrl(url, callback) { 
    $('<img>', { 
     src: url, 
     load: function() { 
      callback(true); 
     }, 
     error: function() { 
      callback(false); 
     } 
    }); 
} 
var ndata = [{imgUrl: "https://library.barnard.edu/sites/default/files/paired_t_test_output_1_and_2.png"},{imgUrl: "url1"},{imgUrl: "http://statistics-help-for-students.com/How_do_I_report_paired_samples_T_test_data_in_APA_style_files/image002.jpg"}]; 


for (var i = 0; i < ndata.length; i++){ 
    var imageUrl = ndata[i].imgUrl; 
    (function(pictureUrl){ 
     isValidImageUrl(pictureUrl, function(result) { 
      if (!result) { 
       ndata[i].imgUrl = "http://media.tcc.fl.edu/webcourses/ctll/Developing_Your_Teaching_Philosophy/examples.jpg"; 
       //I am getting error on this line as TypeError: ndata[i] is undefined 

       //My question here is to how to update the ndata array obejct with valid image URL? 
      } 
     }); 
    }(imageUrl)); 
} 
console.log(JSON.stringify(ndata));// Expecting ndata[1].imgUrl should get updated inside self invoking function with valid image url 
+0

'i' ошибочно, и вы регистрируетесь перед обновлением объекта. – Scimonster

+0

@ Scimonster, поскольку я сделал функцию самозапускания, я ожидаю, что она будет работать нормально. Возможно ли выполнить эту работу? Я буду сожалеть о вашей помощи. Я понимаю логику обратного вызова, но не уверен, как использовать этот цикл for for for? – Rajesh

ответ

0
function isValidImageUrl(url, callback) { 
    $('<img>', { 
     src: url, 
     load: function() { 
      callback(true); 
     }, 
     error: function() { 
      callback(false); 
     } 
    }); 
} 
var ndata = [{imgUrl: "https://library.barnard.edu/sites/default/files/paired_t_test_output_1_and_2.png"},{imgUrl: "url1"},{imgUrl: "http://statistics-help-for-students.com/How_do_I_report_paired_samples_T_test_data_in_APA_style_files/image002.jpg"}]; 


for (var i = 0; i < ndata.length; i++){ 
    var imageUrl = ndata[i].imgUrl; 
    (function(pictureUrl, i){ 
     isValidImageUrl(pictureUrl, function(result) { 
      if (!result) { 
       ndata[i].imgUrl = "http://media.tcc.fl.edu/webcourses/ctll/Developing_Your_Teaching_Philosophy/examples.jpg"; 
       //I am getting error on this line as TypeError: ndata[i] is undefined 

       //My question here is to how to update the ndata array obejct with valid image URL? 

      console.log(ndata); 
      } 
     }); 
    }(imageUrl, i)); 
} 

В дополнение к проходящей imageUrl, вы также должны передать i на анонимные функции, потому что в противном случае он уже потерял свое значение, когда бежит обратного вызова.

Другое дело, вы запускаете console.log() до того, как обратный вызов запущен. Вам необходимо войти в систему с помощью обратного вызова. Также обратите внимание, что нет гарантии, что он вернется в порядок.

+0

Спасибо @Scimonster за быстрый ответ. Мой вариант использования немного отличается, я получаю массив объектов JSON (ndata) из ajax-вызова в качестве ответа. После получения ответа мне необходимо проверить каждый объект и обновить URL-адрес изображения, если это необходимо. затем передать обновленный ответ на UI, хотя шаблон клиентской стороны Underscore. Вот почему я хотел обновить ndata вне цикла for. Пожалуйста, помогите мне, как сделать это возможным? – Rajesh