试图理解Nodejs的承诺

时间:2018-02-06 23:13:40

标签: javascript node.js es6-promise

我试图理解承诺,似乎我在示例中看到的所有承诺都遵循瀑布模式,其中前一个函数的结果被传递给.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.
)

我错过了什么?

1 个答案:

答案 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并抛出标准错误)