函数内部的JavaScript延迟,没有全局变量

时间:2013-11-29 03:39:03

标签: javascript

有没有办法在没有全局变量的函数内等待异步操作?

我知道,如果我有全球性,我可以这样延迟:

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锁定异步请求同步或其他什么?

2 个答案:

答案 0 :(得分:3)

您可以尝试使用jQuery Deferreds:

http://api.jquery.com/category/deferred-object/

答案 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
    };
    ...
}

希望它有所帮助!