Почему, если я добавлю resol () в функцию обратного вызова fs, обещание не возвращается - PullRequest
0 голосов
/ 27 февраля 2020

(советы: я использую nodejs framework eggjs на основе koa)

Код, приведенный ниже, может успешно выполняться. Но если я введу resolve() в функцию обратного вызова fs.renameSync() обещание не вернет ничего, и запрос сохраняет статус в ожидании .

Что вызывает это? Связано ли это с порядком исполнения?


 async uploadAsset(assetName, file) {
    const { app } = this;
    const logger = this.logger;
    return new Promise(function(resolve, reject) {
      fs.renameSync(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`, err => {
        if (err) {
          logger.warn(err);
          reject();
        }
      });
      resolve();
    });
  }

1 Ответ

1 голос
/ 27 февраля 2020

renameSync - синхронная версия rename. Он не принимает обратный вызов в качестве аргумента; он принимает только oldpath и newpath . Если вы передадите третий аргумент, он будет проигнорирован; передаваемая вами функция обратного вызова никогда не вызывается.

Если вы хотите, чтобы она основывалась на обратном вызове, вместо этого используйте fs.rename, который делает обратным вызовом.

Ваш resolve также вне обратного вызова в тот момент, когда он должен быть внутри:

async uploadAsset(assetName, file) {
  const { app } = this;
  const logger = this.logger;
  return new Promise(function(resolve, reject) {
    fs.rename(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`, err => {
      if (err) {
        logger.warn(err);
        reject();
      }
      resolve();
    });
  });
}

Или используйте вместо него fs.promises, чтобы выполнить sh, не создавая Обещай себя.

async uploadAsset(assetName, file) {
  const { app } = this;
  const logger = this.logger;
  return fs.promises.rename(file.filepath, `${app.config.multipart.projectAssetLocalPath}${assetName}`)
    .catch((err) => {
      logger.warn(err);
      throw new Error(err);
    });
}
...