Как вернуть переменную вместе с обещанием функции javascript? - PullRequest
1 голос
/ 28 марта 2020

Вот где я застрял:

var verifyEmp = async function () {
    return 'Verified';
}


Employee.find(email, password)
.then((emp) => {
    console.log(emp);
    return verifyEmp();
})
.then((msg) => {
    console.log({ verificationMsg: msg });
})
.catch((err) => {
    console.log(err);
})

Как вы можете видеть, verifyEmp является возвращаемой функцией promise (В демонстрационных целях я сохранил эту функцию настолько простой, насколько это возможно). Итак, чего я хочу добиться, так это иметь возможность регистрировать {Emp: emp, verifyMsg: msg} во втором then. Как передать переменную emp во второй then при возврате promise.

Я знаю, что это удобно сделать с помощью async / await. Я просто изучаю, как это можно сделать, используя традиционные обещания.

Ответы [ 4 ]

1 голос
/ 28 марта 2020

Если вы просто хотите использовать обещания, вы можете вложить then() во второе, которое разрешается с результатом первого:

const verifyEmp = async function () {
    return 'Verified';
}

const Employee = {
    async find() {
        return "An employee"
    }
}

Employee.find()
.then(emp => verifyEmp().then(msg => [emp, msg]))
.then(([emp, msg]) => {
    /* do something with amp and msg */
    console.log({emp: emp, verificationMsg: msg });
})
.catch((err) => {
    console.log(err);
})
1 голос
/ 28 марта 2020

Вы можете вернуть результат Promise из вызова verifyEmp().then() (так как async функции возвращают Promise) из первого find().then обратного вызова.

Там вы можете передать и результат вызова verifyEmp(), а также объект emp из текущей области, обернутый в другом объекте, к следующему then в цепочке.

Promise из verifyEmp().then() автоматически разворачивается в следующем then обратном вызове в цепочке:

var verifyEmp = async function () {
    return 'Verified';
}

const Employee = {
  find: async function(email, password){
    return {email, password, "id":123};
  }
}

Employee.find("test@abc.com", "test")
.then((emp) => {
    //This promise woud get unwrapped in the next .then callback
    return verifyEmp()
           .then((msg) => ({emp,msg}));
})
.then((msg) => {
    console.log(msg);
})
.catch((err) => {
    console.error(err);
})
0 голосов
/ 28 марта 2020

Просто верните json объект вместо строки.

var verifyEmp = async function () {
    return 'Verified';
}


Employee.find(email, password)
.then((emp) => {
    console.log(emp);
    return {emp:emp, msg:verifyEmp()};
})
.then((res) => {
    console.log({ Emp: res.emp, verificationMsg: res.msg });
})
.catch((err) => {
    console.log(err);
})
0 голосов
/ 28 марта 2020

Не проверял. Используйте asyn c iife или что-то в этом роде, если вы ненавидите анти-паттерны. Это решение будет работать независимо от того, вернет ли обещание verifyEmp или нет.

var verifyEmp = async function () {
    return 'Verified';
}


Employee.find(email, password)
.then((emp) => {
    console.log(emp);
    return (async function(){return verifyEmp()})().then((ver)=>[emp,ver]);
})
.then((msg) => {
    console.log({ verificationMsg: msg });
})
.catch((err) => {
    console.log(err);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...