如何等待函数返回的值

时间:2020-08-19 11:35:50

标签: javascript express

我正在尝试在http get请求之后填充数字数组。我实现了一个应返回此数组的函数,但是当我尝试使用它时,它为空。 我尝试console.log函数内部的数组,并正确地填充了我期望的值,但是它似乎在函数执行后而不是执行期间记录下来。

我不知道如何等到函数填满数组才能正确使用它,您能帮我吗?在其他.then内使用.then方法可以吗?

以下是代码,我对其进行了简化以使其更易于理解:

router.get('/newRail/:trainNumber', function (req, res) {
    railsAvailable(req.params.trainNumber).then(function (placing) {
        res.json(placing);
        // If you read placing at this moment it results empty
    });
});

function railsAvailable(trainNumber) {
    return Promise.resolve(findBadRail(trainNumber));
}

function findBadRail(trainNumber) {
    var badRail = [];
    getPlacingByTN(trainNumber).then(placing => {
        badRail.push(placing.rail);

        getAllPlacings().then(allPlacings => {
            allPlacings.forEach(function (p) {
                //some computation on the array here...
                // .....
                // .....
                badRail.push(p.rail);
            });
            console.log(badRail)
        });
    });
    return badRail;
}

function getPlacingByTN(trainNumber) {
    // getting from a mongoDb collection
    return CollectionDB.findOne({"trainNumberArr": {$eq: trainNumber}}, {});
}

function getAllPlacings() {
    // getting from a mongoDb collection
    return CollectionDB.find();
}

1 个答案:

答案 0 :(得分:0)

findBadRail将最有可能在getPlacingByTN解决之前返回……您是否尝试过使用async/await

async function findBadRail(trainNumber) {
    var badRail = [];
    const placing = await getPlacingByTN(trainNumber);
    badRail.push(placing.rail);
    const allPlacings = await getAllPlacings();
    allPlacings.forEach(p => badRail.push(p.rail);
    console.log(badRail);
    return badRail;  
}