有关如何操作js的一般性问题

时间:2018-10-09 20:06:57

标签: javascript promise async-await

我有一些现有的代码可以兑现承诺。

我要在此过程之前添加新步骤,但这是有条件的。

之前:

user = username
password = password
hosts = localhost
dbname = mail
query = SELECT 1 FROM virtual_users WHERE domain='%n' AND active = '1'

之后(此代码错误):

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条件使我无法使用ifmanipulate_files链接到rename_files上!

2 个答案:

答案 0 :(得分:0)

好像是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) => { ... })
}

答案 1 :(得分:0)

您可以将零件包装到另一个函数中,并将其附加到.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) => { ... })
 }

或者您只使用异步/等待。