2016-06-16 2 views
0

Я использую AngularJs и модуль ngSweetAlert http://oitozero.github.io/ngSweetAlert/#/home, я должен ждать выполнения команд в функции кнопки подтверждения в цикле:ожидание функции результата в цикле

for (var i = 0; i < myArray.length; i++) { 
    SweetAlert.swal({ 
     title: "Are you sure?", 
     text: "Your will not be able to recover this imaginary file!", 
     type: "warning", 
     showCancelButton: true, 
     confirmButtonColor: "#DD6B55", 
     confirmButtonText: "Yes, delete it!", 
     cancelButtonText: "No, cancel plx!", 
     closeOnConfirm: false, 
     closeOnCancel: false 
    }, function(isConfirm) { 
     if (isConfirm) { 
      // Instructions using myArray 
     } else { 

     } 
    }); 
} 
+0

Возможный дубликат [Закрытие внутренних циклов JavaScript - простой практический пример] (http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example) – 4castle

+0

@ 4castle Это не имеет ничего общего делать с закрытием JS в циклах. Его о том, чтобы вызвать обратный вызов, блокирует обработку цикла. –

+0

Пойдите в мое решение, но очень быстро ... вы пытаетесь создать array.length количество ящиков подтверждения появляется сразу? потому что я уверен, что это будет результат того, что у вас есть. каждый раз, когда вы вызываете функцию sweetalert.swal, он создает окно подтверждения, так что вы либо получите потенциально много ящиков подтверждения, либо вы получите одно окно подтверждения, которое будет перезаписано связкой. вам может понадобиться переместить вызов функции сладкого окна outjde loop –

ответ

1

EDIT: Оригинальный пример опроса неверен, как отметил Эндрю Luhring

Вот как вы можете использовать асинхронный стиль обратного вызова для планирования каждого оповещения всплывающих окон после прежних отделки:

function showAlertNTimes(n) { 
    if (n > 0) { 
     SweetAlert.swal({...}, function() { 
      // Do confirmation stuff 
      showAlertNTimes(n - 1); 
     }); 
    } 

} 
showAlertNTimes(myArray.length); 
+0

Не положительно, но я уверен, что вызов цикла while без предоставления выхода приведет к сбою страницы. Я знаю, что это то, что должна делать ваша «сделанная» переменная. если вы хотите опросить что-то подобное, вы, вероятно, можете использовать setInterval, который проверяет каждый раз, а затем использовать clearInterval, как только это сделано, это правда, но я все же согласен с вами, что это не лучший способ решить его проблему. –

+0

Да, ты прав. Время не будет работать с однопоточным JS. К сожалению, вы не можете реализовать цикл блокировки опроса с помощью setInterval, поскольку по той же причине вы не можете напрямую блокировать результат предупреждения, это асинхронные API, которые принимают обратный вызов. –

+0

@AndrewLuhring Спасибо за исправление, я обновил ответ. –

0

использования обещание:

var deferred = $q.defer(); 
q.resolve(isConfirm); // or whatever ur data is 
return deferred.promise; 

затем используйте «затем», чтобы указать, что должно быть сделано с результатом возвращенного обещания;

yourFn().then(function(isConfirm){ 
    //do stuff 
}); 
+0

Это не помогает ОП с их проблемой, которая должна ждать выполнения обратного вызова в цикле. –

0

Осторожно, непроверено

Не знаком с лайком, но после быстрого изучения его исходной трески е он, кажется, не обеспечивает обещания, поэтому я написал небольшую обертку (на основе ЦСИ на связанную демо-странице):

//since swal doesn't implement promises on it's own, here a wrapper that returns one 
function $swal(title, message, type){ 
    return typeof message === "function"? $swal(title).then(message): 
     typeof title !== "object"? $swal({ title:title, message:message, type:type }): 
     config => $q(function(resolve){ window.swal(config, resolve) }); 
} 

это должно вести себя так же, как регулярный своп-функция только что это возвращает обещание. нуждается в $q от углового и инициализируется SweetAlert

Теперь asyncromity получить легко:

myArray.reduce(function(prev, value, index, arr){ 
    //wait till the previous promise has been resolved, 
    //then resolve the this one 
    return prev.then(function(){ 
    //return prev.catch(/* error handling for prev */).then(function(){ 

     //utilize the wrapped function. 
     return $swal({ 
      title: "Are you sure?", 
      text: "Your will not be able to recover this imaginary file!", 
      type: "warning", 
      showCancelButton: true, 
      confirmButtonColor: "#DD6B55", 
      confirmButtonText: "Yes, delete it!", 
      cancelButtonText: "No, cancel plx!", 
      closeOnConfirm: false, 
      closeOnCancel: false 
     //}).then(function(isConfirm){ 
     }, function(isConfirm){ //this is just an alias for the previous line 
      console.log(index, isConfirm, value); 
     }); 
    }); 
}, $q.resolve(true)); 

Я прохожу в разрешенной Promise, так что я не приходится иметь дело с кастрированный баран это первый или зависимый вызов.

сокращение также обертывает текущий индекс и значение для каждого вызова.

Одна вещь, которая еще не обработана, - это если ваш код вызывает ошибку.

Редактировать: Как отметил 4castle в комментарии, SweetAlert2, похоже, выполняет обещания.
Ну, тогда вам просто не нужна обертка $ swal и используйте регулярную функцию swal с уменьшением.

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