как я могу последовательно выполнить asyn c код? - PullRequest
0 голосов
/ 18 июня 2020
    await fs.mkdir(path.join(__dirname, "/smartsheet_download"), 
   { recursive: true }, (err) => { 
     if (err) { 
       return console.error(err); 
     } 
     __dirname= path.join(__dirname, "/smartsheet_download");
   console.log("after func:" + __dirname);
   })

   console.log("this must be printed after path at last")
}

мой вопрос в этой функции выше: я печатаю «это должно быть напечатано после пути, наконец» после операции fs.mkdir, но когда я запускаю код, он печатает первым. Я использую asyn c и ожидаю, чтобы он дождался, пока fs.mkdir завершит выполнение, прежде чем печатать последнюю строку. По-прежнему это не работает. Не могли бы вы сказать, как мне дождаться завершения fs.mkdir и затем передать выполнение на следующую строку. кроме того, расскажите, пожалуйста, почему здесь не работают await?

1 Ответ

1 голос
/ 18 июня 2020

ваш лог c правильный. однако, если вы посмотрите на подпись fs.mikdir, она вернет void

export function mkdir(path: PathLike, options: MakeDirectoryOptions & { recursive: true }, callback: (err: NodeJS.ErrnoException | null, path: string) => void): void; <---

, что означает, что он не может быть await ed, хотя он выполняет задачу asyn c, но из-за того, что возвращает void , этого нельзя ждать.

обратный вызов существует, когда вам нужно знать, что произошло с операцией, успешно / не удалось что-то в этом роде, поэтому ваш журнал происходит раньше, потому что mkdir возвращает void.

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

fs.mkdir(path.join(__dirname, "/smartsheet_download"), 
   { recursive: true }, (err) => { 
     if (err) { 
       return console.error(err); 
     } 
     __dirname= path.join(__dirname, "/smartsheet_download");
   console.log("after func:" + __dirname);

 console.log("this must be printed after path at last")
   })



...