общий вопрос о том, как манипулировать JS обещаниями - PullRequest
0 голосов
/ 09 октября 2018

У меня есть существующий код, который выполняет обещание.

Я добавляю новый шаг в процесс, который должен произойти до него, но условно.

До:

let promise_manipulate_files = util.promisify(_async.eachOfLimit)(fs.readdirSync(directory), 5, (f, _i, cb) => { ... })

После (этот код неверен):

if (filesNeedToBeRenamed()) {
  let promise_rename_files = Promise.all(fs.readdirSync(directory).map(
    file => util.promisify(fs.rename)(file, amendedFilename(file))
      .catch({ ... })
    ));
}
let promise_manipulate_files = util.promisify(_async.eachOfLimit)(fs.readdirSync(directory), 5, (f, _i, cb) => { ... })

Проблема заключается в том, что второе обещание не должно начинаться до первогоОбещание полностью закончено.

Это верхний уровень моего сценария.

Является ли единственный практический способ получить то, что я хочу, чтобы обернуть весь код в async () => {} замыкание и await в первом обещании?

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

Я считаю, что суть проблемы заключается в том, что условие if не дает мне возможности напрямую связать manipulate_files сrename_files с помощью .then()!

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы можете заключить деталь в другую функцию и прикрепить ее к цепочке .then:

 if (filesNeedToBeRenamed()) {
   let promise_rename_files = Promise.all(fs.readdirSync(directory).map(
     file => util.promisify(fs.rename)(file, amendedFilename(file))
      .then(getFile)
      .catch({ ... })
   ));
 } else {
    getFile();
 }

 function getFile() {
   let promise_manipulate_files = util.promisify(_async.eachOfLimit)(fs.readdirSync(directory), 5, (f, _i, cb) => { ... })
 }

Или просто использовать async / await.

0 голосов
/ 09 октября 2018

Похоже, если filesNeedToBeRenamed(), сделайте это иначе, просто выполните следующую часть безоговорочно.так что вы можете ссылаться на promise_manipulate_files как отдельную функцию в обеих точках или написать ее дважды.Но, может быть, я не понимаю вопроса.

if (filesNeedToBeRenamed()) {
    let promise_rename_files = Promise.all(fs.readdirSync(directory).map(
        file => util.promisify(fs.rename)(file, amendedFilename(file))
          .catch({ ... })
        ));

    // attach .then() callback here (however you can) for promise_manipulate_files
} else {
    // Otherwise, do this unconditionally here
    let promise_manipulate_files = util.promisify(_async.eachOfLimit) 
    (fs.readdirSync(directory), 5, (f, _i, cb) => { ... })
}
...