Как добавить задержку в асинхронный скрипт
Вот этот скрипт осуществляет множественную загрузку, обращение к серверу POST осуществляется асинхронно, скажите пожалуйста как отрегулировать скрипт так чтобы по complete каждого имиджа создавалась пауза пока я не отвечу на вопрос продолжить ли загрузку, а потом только следующий POST улетал на сервер - дело в том что на сервере по каждому имеджу происходит запись в сессию.
Скрипт немного сокращен отсутствуют инит моменты но сама суть понятна должна быть (function($) { self._damnUploaderUploadItem = function(url, item) { if (!checkIsFile(item.file)) { return false; } var xhr = new XMLHttpRequest(); var progress = 0; var uploaded = false; if (xhr.upload) { xhr.upload.addEventListener("progress", function(e) { if (e.lengthComputable) { progress = (e.loaded * 100) / e.total; if ($.isFunction(item.onProgress)) { item.onProgress.call(item, Math.round(progress)); } } }, false); xhr.upload.addEventListener("load", function(e){ progress = 100; uploaded = true; }, false); } else { uploaded = true; } xhr.onreadystatechange = function () { var callbackDefined = $.isFunction(item.onComplete); if (this.readyState == 4) { item.cancelled = item.cancelled || false; if (this.status < 400) { if (!uploaded) { if (callbackDefined) { item.onComplete.call(item, false, null, 0); } } else { if ($.isFunction(item.onProgress)) { item.onProgress.call(item, 100); } if (callbackDefined) { item.onComplete.call(item, true, this.responseText); } } } else { if (callbackDefined) { item.onComplete.call(item, false, null, this.status); } } } }; var filename = item.replaceName || item.file.name; xhr.open("POST", url); if ($.support.fileSending) { var cnt=count(queue); var formData = new FormData(); formData.append((item.fieldName || 'file'), item.file); xhr.send(formData); } else if ($.support.fileReading && xhr.sendAsBinary) { var boundary = "xxxxxxxxx"; var body = "--" + boundary + "\r\n"; filename = unescape(encodeURIComponent(filename)); body += "Content-Disposition: form-data; name='"+(item.fieldName || 'file')+"'; filename='" + filename + "'\r\n"; body += "Content-Type: application/octet-stream\r\n\r\n"; body += (item.file.getAsBinary ? item.file.getAsBinary() : item.file.readAsBinary()) + "\r\n"; body += "--" + boundary + "--"; xhr.sendAsBinary(body); } else { xhr.setRequestHeader('Upload-Filename', item.file.name); xhr.setRequestHeader('Upload-Size', item.file.size); xhr.setRequestHeader('Upload-Type', item.file.type); xhr.send(item.file); } item.xhr = xhr; } var isFileField = ((self.get(0).tagName == 'INPUT') && (this.attr('type') == 'file')); if (isFileField) { var myName = self.eq(0).attr('name'); if (!$.support.fileSelecting) { if (myName.charAt(myName.length-1) != ']') { myName += '[]'; } self.attr('name', myName); self.attr('multiple', false); var action = self.parents('form').attr('action'); self._damnUploaderFakeForm = $('<form/>').attr({ method: 'post', enctype: 'multipart/form-data', action: action }).hide().appendTo('body'); } else { self.attr('multiple', true); } self._damnUploaderChangeCallback = function() { self._damnUploaderFilesAddMap($.support.fileSelecting ? this.files : this, set.onSelect); }; self.on({ change: self._damnUploaderChangeCallback }); } if (set.dropping) { self.on({ drop: function(e) { self._damnUploaderFilesAddMap(e.originalEvent.dataTransfer.files, set.onSelect); return false; } }); if (set.dropBox) { $(set.dropBox).on({ drop: function(e) { self._damnUploaderFilesAddMap(e.originalEvent.dataTransfer.files, set.onSelect); return false; } }); } } return self; } switch(params) { case 'addItem': if (!data) { return false; } var queueId = uniq(5); if (data.file.fake) { var input = $(data.file.inputElement); var cloned = $(input).clone(); $(input).before(cloned); $(input).attr('id', queueId); $(input).appendTo(self._damnUploaderFakeForm); cloned.on({ change: self._damnUploaderChangeCallback }); self._damnUploaderItemsCount++; return queueId; } if (!checkIsFile(data.file)) { return false; } queue[queueId] = data; self._damnUploaderItemsCount++; return queueId; break; case 'startUpload': if (!set.url) { return self; } if (!$.support.fileSelecting) { self._damnUploaderFakeForm.submit(); return self; } var i =0; var complete_one = false; $.each(queue, function(queueId, item) { var compl = item.onComplete; item.fieldName = item.fieldName || set.fieldName; item.onComplete = function (successful, data, error) { if (!this.cancelled) { delete queue[queueId]; self._damnUploaderItemsCount--; } if ($.isFunction(compl)) { compl.call(this, successful, data, error); } if ((self._damnUploaderItemsCount == 0) && ($.isFunction(set.onAllComplete))) { set.onAllComplete.call(self, data); } }; self._damnUploaderUploadItem(set.url, item); }); break; } |
Часовой пояс GMT +3, время: 10:42. |