异步javascript问题

参见英文答案 > How do I return the response from an asynchronous call?                                    33个
我正在尝试创建一个函数详细信息(),根据可用事件查找某些事件(getdetails)的详细信息.在下面的示例中,将询问具有ID ZRGZZ,RGHER和GRFDZ的事件的详细信息.这些细节应该放在一个数组中(信用到Theodore’s answer).结果应该是当我调用details()时,结果数组被存储,以便稍后我可以使用它.

问题是我不知道如何返回这个最终数组.的console.log(JSON.stringify(RES));在数组构造完成之前执行.我知道这可能与异步js有关,但我无法绕过它…

function details()
{
    var res = {
    "Result": "success",
    "Key": "12345",
    "Data": [{
        "ID": "ZRGZZ",
        "lastChangedDate": "2015-12-03 11:14:27"
    }, {
        "ID": "RGHER",
        "lastChangedDate": "2015-12-03 15:17:47"
    }, {
        "ID": "GRFDZ",
        "lastChangedDate": "2015-12-03 05:25:11"
    }]
};

    var i = 0;
    var tmp;
    res.Data.map(function(val,i){

        getdetails(val.ID).then(function(data){
            tmp = JSON.parse(data);
            console.log(tmp);
            Object.keys(tmp.Data[0]).map(function(v,j){
                val[v] = tmp.Data[0][v];
                console.log(JSON.stringify(res)); //(*)the last res gives me the result I'm looking for
            });

        }, function(error){ //error callback
            console.log(error)
        });


    });
console.log(JSON.stringify(res)); //this is executed before (*)
}
最佳答案
那么你已经使用了promise – 然后在你的代码中看到它是否有角度然后它本身会返回延迟的promise,所以你可以这样做:

res.Data.map(function (val, i) {
    getdetails(val.ID).then(function (data) {
        tmp = JSON.parse(data);
        Object.keys(tmp.Data[0]).map(function (v, j) {
            val[v] = tmp.Data[0][v];
        });
    }, function (error) { //error callback
        console.log(error)
    }).then(function () {
        console.log(JSON.stringify(res));
    })
});

编辑:将服务$q注入您的控制器或服务

promises = [];
res.Data.map(function (val) {
    promises.push(getdetails(val.ID).then(function (data) {
        tmp = JSON.parse(data);
        Object.keys(tmp.Data[0]).map(function (v, j) {
            val[v] = tmp.Data[0][v];
        });
    }, function (error) { //error callback
        console.log(error)
    }));
});
$q.all(promises).then(function () {
    console.log(JSON.stringify(res));
});

现在,当所有的getdetails都得到解决时,您可以使用console.log或对数据执行任何操作

转载注明原文:异步javascript问题 - 代码日志