有没有办法在没有全局变量的函数内等待异步操作?
我知道,如果我有全球性,我可以这样延迟:
var flag = 0; // global
function wait_for_convert() {
if(!flag) {
setTimeout(wait_for_convert, 50);
}
else {
request.send(data);
}
}
wait_for_convert();
但是,如果我有许多异步操作,将所有这些等待放到全局范围内会非常烦人。
例如,我需要一个从异步请求中返回数据的函数,如下所示:
function append_resized(resized_images, name, file)
{
var reader = new FileReader();
reader.onload = function(e) {
var img = document.createElement("img");
img.onload = function() {
var dataurl = dataurl_resize(this);
// WOULD BE NICE TO RETURN THIS RESULT
// LIKE THIS: return {'blob': dataURLtoBlob(dataurl), 'filename': file.name};
resized_images[name] = {'blob': dataURLtoBlob(dataurl), 'filename': file.name};
};
img.onerror = function() {
resized_images[name] = undefined;
}
img.src = e.target.result;
};
reader.readAsDataURL(file);
}
也可能有libs锁定异步请求同步或其他什么?
答案 0 :(得分:3)
您可以尝试使用jQuery Deferreds:
答案 1 :(得分:2)
您可以使用回调,实际上我建议只使用此解决方案(您可以拥有多少个标志?):
function afterSomething() {
request.send(data);
}
此回调可以传递给另一个函数并从那里触发:
function doSomething(callback) {
// do something
callback();
}
doSomething(afterSomething);
这样做可以创建回调链,存在于不同的范围内,等等。这就是功能编程的强大功能。
所以根据你的例子,你可以这样做:
function onLoadCallback(name) { console.log(name); }
function append_resized(resized_images, name, file, onLoadCallback) {
...
img.onload = function() {
var dataurl = dataurl_resize(this);
// WOULD BE NICE TO RETURN THIS RESULT
// LIKE THIS: return {'blob': dataURLtoBlob(dataurl), 'filename': file.name};
resized_images[name] = {'blob': dataURLtoBlob(dataurl), 'filename': file.name};
onLoadCallback(name); // you can pass whatever you want and need of course
};
...
}
希望它有所帮助!