AngularJS和异步调用

时间:2017-03-17 13:49:28

标签: javascript angularjs asynchronous

我是一个AngularJS承诺新手并且对如何实现它感到非常沮丧。我希望有人可以帮助我。

我有以下客户端代码:

// Pass result to ng-csv directive.
$scope.generateEmployeeData = function () {
        $scope.employeename = empName;
        $http.get('/api/employee-information/download').then(function (data) {
            console.log(data);
            return data;
        }).catch(function (err) {
            ToastFactory.error({
                title: "Oops!",
                text: "Something went wrong while downloading employee data.",
                icon: "exclamation-sign"
            });
        });
    }

......和ff。服务器端代码:

// Download Employee data (.../api/employee-information/download)
exports.downloadEmployee = function (req, res) {
    var tempCtr = [];

    var dlPromise = EmployeeInfo.find({}, function (err, results) {
        var tempCtr = [];
        if (err) { return err; }

        console.log("dlpromise in");
        return results;
    });

    q.all(dlPromise)
        .then(function (results) {
            _.forEach(results, function (item) {
                tempCtr.push({
                    employeeID: item.employeeID,
                    employeeName: item.employeeName
                });
            });
        });

    console.log("tempctr out");
    console.log(tempCtr);

    return res.json(tempCtr);
}

当我检查我的日志时,我看到在console.log("tempctr out")之前先调用console.log("dlpromise in"),我知道它是因为该过程是异步的。这就是我使用q.all(基于this SO answer)的原因,因为我认为它会在进入dlPromise之前先解决then()。但它没有用。我错过了什么?我是否理解AngularJS'承诺一般会有偏差吗?

我一直试图解决这个问题很长一段时间没有成功。请帮忙。

谢谢。

更新:我在console.log("dlpromise in");之后添加了一个console.log。这是结果:

dlpromise in
[ { _id: 58c7b885db0afd48ee427a73,
    employeeID: '12349876',
    employeeName: 'Tester'}]

1 个答案:

答案 0 :(得分:1)

我对服务器端代码并​​不熟悉,但我假设它是NodeJS?

我认为您可以将代码更改为某些内容(假设res.json(tempCtr)发送响应数据):

exports.downloadEmployee = function (req, res) {
    EmployeeInfo.find({}, function (err, results) {
        var tempCtr = [];
        if (err) { return err; }

        _.forEach(results, function (item) {
            tempCtr.push({
                employeeID: item.employeeID,
                employeeName: item.employeeName
            });
        });

        console.log("tempctr out");
        console.log(tempCtr);
        res.json(tempCtr);
    });
}