我试图理解承诺,似乎我在示例中看到的所有承诺都遵循瀑布模式,其中前一个函数的结果被传递给.then函数,并且该函数的结果被传递一次又一次地使用.then函数。
如果我需要按特定顺序执行某些操作,但下一个函数不依赖于前一个承诺的输出,该怎么办?
const obj = {
key1: value1,
key2: value2
};
const files = ['file1', 'file2', 'file3'];
Promise.all(files.map(makeBackups))
.then(
// use obj to create new strings to be inserted into orig files after they were backed up - Could be done at same time orig files are being backed up
)
.then(
// write to files now that they have a backup and content to be written
)
.catch(
// something happened when trying to write a file.
)
我错过了什么?
答案 0 :(得分:0)
你理解得很好。不幸的是,没有银弹,这是获得一些订单的最简单方法,但不要依赖以前的承诺"将它保存在具有更大范围的变量中(从承诺链的角度来看,基本上作为全局变量执行)
function doIt() {
let someVariable;
Promise.all(files.map(makeBackups))
.then((val) => (someVariable = val)) // saving something to val
.then(
// do something unrelated to the input, but in this order
)
.then(() => {
if (someVariable > 5){ } // using the variable when you need it
}
.catch(
// something happened when trying to write a file.
)
}
如果您可以使用较新版本的Node.js,那么就会有异步等待让您的生活更轻松
async function doIt() {
const someVariable = await Promise.all(files.map(makeBackups))
await somePromise// do something unrelated to the input, but in this order
if (someVariable > 5){ } // using the variable when you need it
}
try-catch可以在整个doIt上使用 - 它有一个优势,它可以捕获两者 - 被拒绝的承诺(如果等待它们)以及承诺之外的错误(即错误输入someVariable并抛出标准错误)