Promise 数据和异常处理

Promise data and exception handling

我对 promise 的使用感到困惑,特别是它的数据操作方式(将值从一个块传递到另一个块)和异常处理(冒泡错误)。我正在尝试学习使用 promise 和处理错误的正确方法,例如

Error: A caught error.
    at promiseTwo()
    at promiseOne()
    at subprocess()
    at mainprocess()

以下是我实现它们的两次尝试:

尝试 1:笨拙,嵌套很深,错误未被发现。

var subprocess = () => {
    return new Promise((resolve, reject) => {
        promiseOne().then(data1 => {
            // Some code with data1, throw some error
            promiseTwo().then(data2 => {
                // Some code with data1n2, throw some error
                promiseThree().then(data3 => {
                    // Data manipulation with data1, data2, and data3
                    return resolve(<...>)
                }).catch(err3 => { throw err3 })
            }.catch(err2n3 => { throw err2n3 })          // >>> ERR: Cannot get err3.
        }.catch(err1n2n3 => { return reject(err1n2n3) }) // >>> ERR: Cannot get err3 or err2.
    }
}

return new Promise((resolve, reject) => {
    subprocess().then(data => {
        // TODO
    }).catch(allErr => { return reject(allErr) }
}

尝试 2:无法使用来自先前承诺块的数据。

var subprocess = () => {
    return new Promise((resolve, reject) => {
        promiseOne()
        .then(data1 => {
            // Some code with data1, throw some error
            return promiseTwo()
        })
        .then(data2 => {
            // Some code with data1n2, throw some error
            // >>> ERR: Cannot get data1
            return promiseThree()
        })
        .then(data3 => {
            // Data manipulation with data1, data2, and data3
            // >>> ERR: Cannot get data1 and data2
            return resolve(<...>)
        })
        .catch(err1n2n3 => { 
            return reject(err1n2n3) 
        })
    }
}

return new Promise((resolve, reject) => {
    subprocess().then(data => {
        // Some code, throw some error
    }).catch(allErr => { return reject(allErr) }
}

注意: 一些 promise 块(即 promiseOnepromiseTwo 等)是预定义的,所以我无法控制他们会 return 什么数据。我确信尝试中有更多错误(例如,如果 return 使用函数是正确的方法)。

请帮忙。谢谢。

听起来你在寻找 Promise.all,它可以让你设置一系列的承诺,然后在它们全部解决后处理结果。

对于这种情况,可以结合使用promises和async-await。

从问题来看,似乎我们有三个 promise 和一个执行和处理它们的函数。

你可以试试这样的 -

const subProcess = () => {
  return new Promise((resolve, reject) => {
    // Using IIFE ( You shouldn't put async keyword on promise callbac )
    (async () => {
      // Use of try catch to handle the errors
      try { 
        await promiseOne()
        await promiseTwo()
        await promiseThree()
        // Additional code if need after them
      } catch(err){
        // Handle error ( all three promise error will be transferred here )
      }
    })()

  })
}

上面的代码等待 promise 一个接一个地执行,如果有的话,也会从所有三个 promise 中捕获错误。

正如@samuei 提到的,您也可以在此使用 Promise.all()。

const subProcess = () => {
  return new Promise((resolve, reject) => {
    // Using IIFE ( You shouldn't put async keyword on promise callbac )
    (async () => {
      // Use of try catch to handle the errors
      try { 
        const myPromises = [promiseOne, promiseTwo, promiseThree];
        const res = await Promise.all(myPromises);
        // Additional code if need after them
      } catch(err){
        // Handle error ( all three promise error will be transferred here )
      }
    })()

  })
}

如果你不想使用 async-await 那么你也可以这样做

const subProcess = () => {
  return new Promise((resolve, reject) => {
    const myPromises = [];
    const myPromises = [promiseOne, promiseTwo, promiseThree];

    Promise.all(myPromises)
    .then(res => {
      // Handle the response
    })
    .catch(err => {
      // Handle the error
    })

  })
}