【问题标题】:Return value from promise rather than console从承诺而不是控制台返回值
【发布时间】:2018-10-14 13:57:40
【问题描述】:

我们如何从promise而不是console.log返回一个值?如果我将控制台更改为return(values[1] - values[0])。并尝试执行console.log(balance(user)),它会打印Promise { <pending> }。

我不知道我是否做对了,我想做的是通过从所有存款/取款中减去所有购买来获得用户余额。如果没有承诺,它会在数据库查询完成之前返回值。有更好的解决方案吗?

function totalPurchases(user) {
return new Promise(function (resolve, reject) {
    Purchase.getTotalPurchases(user, function (err, tot) {
        if (err) {
            // console.log(err);
            reject(new Error("Error: 1002"));
            // return false;
        }
        else {
            resolve(tot[0].purchases);
        }
    })
})
}
function totalDW(user) {
return new Promise(function (resolve, reject) {
    DepWid.getTotalDepwids(user, function (err, tot) {
        if (err) {
            reject(new Error("Error: 1003"));
        }
        else {
            resolve(tot[0].depWids);
        }
    })
})
}

exports.balance = async (user) => {
let promises = [];
promises[0] = totalPurchases(user);
promises[1] = totalDW(user);

Promise.all(promises)
    .then(function (values) {
        console.log(values[1] - values[0]);
        //Return this rather than console.log
    })
    .catch(function (err) {
        console.log(err);
    })
}

【问题讨论】:

标签: node.js mongodb promise


【解决方案1】:

由于balance 是一个异步函数,您可以等待Promise.all 稍后返回结果。

function totalPurchases(user) {
    return new Promise(function (resolve, reject) {
        setTimeout(function(){
            resolve(5);
        }, 2000);
    })
}
function totalDW(user) {
    return new Promise(function (resolve, reject) {
        setTimeout(function(){
            resolve(3);
        }, 1000);
    });
}

let balance = async (user) => {
    let promises = [];
    promises[0] = totalPurchases(user);
    promises[1] = totalDW(user);   

    const [deposits, withdrawals] = await Promise.all(promises);
    return deposits - withdrawals;
}

balance().then(r => { //If `balance' is called from an async method you can do await here. Else you need to do `then` like I have done here
    console.log(r); //prints 2
});

【讨论】:

  • 它仍然打印 Promise { }
  • 哪里有打印声明?在await 行之后尝试打印。
  • 我已经用完整的工作版本更新了答案,通过使用 setTimeOut 来模拟对数据库的异步调用。
猜你喜欢
  • 2016-07-27
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
  • 2018-12-22
  • 2017-01-11
相关资源
最近更新 更多