Неожиданное поведение - Асинхронное Ожидание при необходимости с IIFE? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть два файла nodejs, в которых async-await не работает, если я require модуль узла (test2.js) , в котором определен IIFE.

test1.js

async function abc() {
    console.log(1)
    let computeFunction = await require("./test2");
    console.log(4)
    computeFunction()
    return null;
}

(async () => { await abc() })()

test2.js

Идея в том, чтобы экспортировать функцию, которая выполняет некоторые вычисления,
, но перед экспортом,Мне нужно инициализировать соединения с базой данных, чтобы функция вычислений работала правильно.

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

(async () => {
    console.log(2)
    // some connection initialization
    await sleep(1000)
    console.log(3)
    return null;
})()

module.exports = async () => {
    // does some computation with those connections
    console.log(5)
    return null;
}

Вывод

Фактический

1
2
4
5
3

Ожидается

1
2
3
4
5

Я решил другое решение, не используя IIFE, но я хочу знать, почему async-await не будет работать, когда требуется модуль с IIFE

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Это очень неправильное утверждение async-await won't work when requiring a module which has an IIFE.Фактический вывод отличается от ожидаемого вывода из-за synchronous nature of require, а не из-за IIFE.

Вы можете получить вывод в порядке 1,2,3(after waiting for 1000ms), 4 ,5, если вы используете любую асинхронную функцию require.

Проверкаэто: -

test1.js

const asyncRequire = require('./async-require');

async function abc() {
    console.log(1)
    let computeFunction = await asyncRequire("./test2.js");
    console.log(4)
    computeFunction()
    return null;
}

(async () => { await abc() })();

test2.js

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

await (async () => {
    console.log(2)
    // some connection initialization
    await sleep(1000)
    console.log(3)
    return null;
})();

module.exports = async () => {
    // does some computation with those connections
    console.log(5)
    return null;
}

async-require.js

const fs = require('fs');
module.exports = async path=>{
    return new Promise((success, fail)=>{
        fs.readFile(path, async (error, file)=>{
            const myModule = {};
            await eval(`(async (module)=>{ ${file.toString()} })(myModule);`);
            success(myModule.exports);
        }); 
    })
}
0 голосов
/ 20 сентября 2019

Здесь вы использовали Promise() внутри него async/await.но async/await само возвращает обещанное значение.проверьте мой код, а также посмотрите на демо.

async function abc() {
  try {
    console.log(1)
    let computeFunction = await hey();
    console.log(4)
    return null;
  } catch (e) {}
}

(async function() {
  await abc()
})();


function sleep() {
  console.log("do some cool stuff"); //make your database connection . 
}

function hey() {
  try {
    (async() => {
      console.log(2)
      // some connection initialization
      await sleep()
      console.log(3)
      return true;
    })()
  } catch (e) {
    console.log(e);
  }
}
...