【问题标题】:node chaining then no return节点链接然后不返回
【发布时间】:2021-09-17 07:27:19
【问题描述】:

我是 async 函数的新手,我想链接一些函数,但我不知道为什么我不能返回最后一个调用

var container = { Login: '', sign_up_text: '', forget_password: '', login_button: '' }
var lang = 'de-DE'
var langID = 1

async function getVars (key, lang){
    return db.localization.findOne({
        where: {
            key: key,
            lang: lang
        }
    })
}
async function getLangID (lang){
    return db.localGroups.findOne({ where: {
            i10s: lang
        },
        attributes: ['id']
    })
}
async function getLocalvars (container, lang){
    var newcontainer = container
    for (let key in container) {
        console.log(lang)
        await getVars(key, lang)
            .then(data => {
                newcontainer[data.key] = data.value;
            })
    }
    return newcontainer;
}
async function desprate() {
    getLangID(lang)
        .then(langdata => {
            getLocalvars(container, langdata.id)
                .then(data => {
                    console.log(data);
                    return data;
                })
        })
}
console.log(desprate());

日志中甚至没有出现承诺;(

谢谢!

【问题讨论】:

  • 你的desprate 和你的外部then 都不返回任何东西。
  • 你能告诉我更多我想我错过了一些“数据”(console.log(data))里面有正确的东西还是你的意思是我需要返回第二个然后返回函数本身?
  • 为什么在async function desprate 中使用.then() 而不是await?
  • 说实话我不知道,但这是我的第一个例子

标签: javascript node.js asynchronous


【解决方案1】:

我会试一试。我没有对此进行测试,但我会尝试在 cmets 中找到关键概念。

var container = {
  Login: '',
  sign_up_text: '',
  forget_password: '',
  login_button: '',
};
var lang = 'de-DE';
var langID = 1;

async function getVars(key, lang) {
  return db.localization.findOne({
    where: {
      key: key,
      lang: lang,
    },
  });
}

async function getLangID(lang) {
  return db.localGroups.findOne({
    where: {
      i10s: lang,
    },
    attributes: ['id'],
  });
}

async function getLocalvars(container, lang) {
  var newcontainer = container;
  // since you're iterating over an object you will have to await all the promises that result in the loop
  await Promise.all(
    Object.keys(container).map(async (key) => {
      const data = await getVars(key, lang);
      // since this is an async function you can just await it rather than chaining it with then
      newcontainer[data.key] = data.value;
    })
  );
  return newcontainer;
}

async function desprate() {
  // let's again take advantage of async/await here
  const langdata = await getLangID(lang);
  const data = await getLocalvars(container, langdata.id);

  console.log(data);
  return data;
}

console.log(desprate());

【讨论】:

  • 谢谢!那么,在几个小时的睡眠后发送js desprate() .then(data => { console.log(data); }) 之类的数据并再次看到它是正确的方法吗?现在等待迭代是完全有意义的o.O非常感谢我对此完全陌生,这是我第一次尝试地狱婚姻使用多个异步函数
  • 完全不用担心。我们都去过那里。是的,如果你使用then,你必须确保你来自returnthen,这样下一个链就会得到你返回的东西。如果您使用async/await,请确保不要使用then,因为使用await 会更容易:)
猜你喜欢
  • 1970-01-01
  • 2014-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多