我有一些现有的代码可以兑现承诺。
我要在此过程之前添加新步骤,但这是有条件的。
之前:
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
条件使我无法使用if
将manipulate_files
链接到rename_files
上!
答案 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) => { ... })
}
或者您只使用异步/等待。