异步函数导致javascript

时间:2018-05-03 05:09:24

标签: javascript jquery asynchronous

警告:这个问题试图通用,所以我使用伪代码。它更多地是关于技术,而不是针对特定问题的实际解决方案。

我的问题是我有一个函数可以对服务器进行多次异步调用来收集信息,我想在另一个函数中使用该函数的结果。在实际结果出现之前,人们如何进行临时调整?

伪代码示例:

var getsomething = function(objs) {

    var results = objs.map(getsomethingforoneobj);

    $.when.apply(this,results).done(function() {
        var result;
        for (var i = 0; i < arguments.length; i++) {
            //do something with the data to augment the variable 'result'
        }
        console.log("load finished");
        console.log(result);
        return result;
    });
}

var getsomethingforoneobj = function(obj) {
    var url = "blabla"
    return $.ajax({
        async:true,
        url:url,
        success : function(data) {
            return data;
        }
    });
}

$(function() {
    var myobjs = [{},{},{},...]
    var a = getsomething(myobjs); //this is where I would want to temporize
    var b = a_function_of_a(a);
    //use b in the rest of the code
});

一个解决方案显然是以同步的方式完成所有事情,但我已经知道这是非常糟糕的形式。

欢迎所有帮助!

2 个答案:

答案 0 :(得分:0)

你需要使用某种承诺来解决这个问题。

q.js

如果库使用promises并且在它们仍然是asyn时保持函数调用状态,那么这是一个。当返回错误并返回成功时,它们甚至会有不同的调用

答案 1 :(得分:0)

我建议您为自己的方案async waterfall

但是如果你不想导入外部库,你可以查看这个函数Finalize,它允许你排队钩子并在从q中删除所有钩子时执行一个函数。

对于你的情况,它可能是这样的:

...
$(function() {

    var a = null;
    var b = null;
    var myobjs = [{},{},{},...]

    var req_set = new Finalize(function() {
        console.log(a, b);
    });

    var hook1 = req_set.queue();
    getsomething(myobjs, function(err, res) {
        a = res
        hook1();
    }); //this is where I would want to temporize

    var hook2 = req_set.queue();
    a_function_of_a(a, function(err, res) {
        b = res;
        hook2();
    });

    req_set.exec();

});

我还将您的功能更改为Error-First Callback