作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 jquery ajax 上传裁剪后的图像。因此,我从 canvas 元素创建一个 blob,将其附加到表单数据中。到目前为止,这工作得很好,但我猜我有一些同步/异步问题。我在网上搜索了 javascript 回调,但我不确定这是否是正确的。问题是
return formData;
将在 blob 添加到表单数据之前执行。我认为有一个简单的解决方案可以解决我的问题,但我无法完成它,也许你可以帮助我。
$.ajax({
url: this.$upload.data('url'),
method: 'POST',
contentType: false,
processData: false,
cache: false,
data: (function(_this) {
var formData = new FormData();
_this.getCroppedImage().toBlob(
function(blob) {
formData.append('file', blob, _this.file.name);
},
_this.file.type
);
$.each(_this.$element.data(), function(key, value) {
formData.append(key, value);
});
return formData;
})(this)
});
也许知道这一点很重要:我也使用 https://github.com/blueimp/JavaScript-Canvas-to-Blob让所有浏览器都可以使用 toBlob 方法。
最佳答案
为了实现这一点,您需要研究 Promise 对象,a good library for this is q.js
基本上,您创建一个函数来构建表单数据,然后等待表单数据完成,当 Promise 解析时,它将通过“then”回调将表单数据传递到您的 ajax 函数中。然后你的ajax调用将被运行
function ajaxFn(){
//result is your formData in this case
getFormData().then(function(result){
//this won't run until the promise resolves, aka formData is complete
$.ajax({
url: this.$upload.data('url'),
method: 'POST',
contentType: false,
processData: false,
cache: false,
data: result
});
});
}
function getFormData(){
var deferred = Q.defer();
var formData = new FormData();
$.each(_this.$element.data(), function(key, value) {
formData.append(key, value);
});
_this.getCroppedImage().toBlob(
function(blob) {
formData.append('file', blob, _this.file.name);
//this is what will get passed into your then function above
deferred.resolve(formData);
},
_this.file.type
);
return deferred.promise;
}
关于javascript - 等待 canvas.toBlob() 后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31195773/
我是一名优秀的程序员,十分优秀!