代码之家  ›  专栏  ›  技术社区  ›  elraphty

请注意,我正在尝试将字符串结果连接到快速路由器中的变量,但它返回空字符串

  •  0
  • elraphty  · 技术社区  · 8 年前

    我试图遍历数组获取值并搜索数据库,然后将数据库结果连接到字符串转换

    app.get('/translate',function(req,res) {
      let translate = '';
      ['hello','love'].forEach(async (word) => {
      let trans = await 
      NaijaLang.find({"engword": word, "naijalang": "yoruba"});
        translate +=" " + trans[0].translation; 
        //Returns values
        console.log(translate)
      });
    
      //Returns Empty String;
    
      console.log(translate)
      res.send(translate);
    });
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   LukáÅ¡ Havrlant    8 年前

    因为你在那里做了一些异步的事情,但是你同步地发送值。基本上,此代码将按以下顺序运行:

    1. 运行 let translate='';
    2. 运行 ['hello','love'].forEach(...)
    3. 运行 await NaijaLang.find(...) 异步for word=hello
    4. 运行 等待Naijalang。找到(…) 不同步地为word=love
    5. 运行 console.log(translate) res.send(translate);
    6. 解决的价值 等待Naijalang。找到(…) ->此时 translate 是第一次更新(word=hello或word=love)。无论提前完成什么)
    7. 解析第二个调用的值 等待Naijalang。找到(…) ->此时 翻译 是第二次更新。但是第五步已经发送了值。

    你可以在这里找到更详细的解释: https://blog.lavrton.com/javascript-loops-how-to-handle-async-await-6252dd3c795

    你也可以在那里找到如何修复它。您可以使用for循环而不是foreach:

    app.get('/translate',function(req,res){
        let translate='';
    
        for (let word of ['hello','love']) {
            let trans=await NaijaLang.find({"engword":word,"naijalang":"yoruba"});
            translate+=" " + trans[0].translation; 
            //Returns values
            console.log(translate)
        }
        //Returns Empty String;
    
        console.log(translate)
        res.send(translate);
    });
    

    这一次,代码将按您可能需要的方式执行。首先, find 方法将调用word=hello,然后,在执行完成后, 找到 方法将调用word=love,最后在两个调用完成后, res.send 将被调用。