在返回 JS 之前等待 Promise 解决

在返回之前等待 Promise 解决

Wait for a Promise to Resolve before Returning in JS

您可以使用async/await语法或.then()在承诺上调用方法以等待它解决。在标有async关键字的函数内部,您可以await在继续执行函数的下一行之前等待承诺解决。

索引.js
async function getNum() { const promise = new Promise(resolve => resolve(42)); const num = await promise; console.log(num); // 👉️ 42 return num; } getNum() .then(num => { console.log(num); // 👉️ 42 }) .catch(err => { console.log(err); });

我们可以使用await关键字来处理标记为
async的函数中的承诺。

async/await语法不会阻止所有 JavaScript 代码的执行。相反,它按顺序运行函数中的代码。

await在函数中使用关键字时,在承诺被解决或拒绝之前,函数的下一行不会运行。

尽管我们的async函数看似返回一个数字,但它实际上返回一个承诺。所有async函数都将它们的返回值包装在一个承诺中。这就是为什么我们不得不使用Promise.then 方法来读取函数的返回值。

您可以使用Promise.then()方法而不是 来获得相同的结果async/await,但Promise.then()语法更冗长且更难阅读。

您可以使用try/catch块来处理承诺被拒绝的场景。

索引.js
async function getNum() { try { const promise = new Promise((resolve, reject) => reject(new Error('test error')), ); await promise; return "This doesn't run" } catch (err) { // 👇️ this runs throw err; } } getNum() .then(num => { console.log(num); }) .catch(err => { // 👇️ this runs console.log(err.message); // ⛔️ "test error" });

如果块中发生错误或承诺拒绝try,错误将传递到catch我们可以处理它的块。

或者,您可以使用
Promise.catch
方法来捕获错误。

调用该Promise.catch()方法与链接另一个.then()
调用并将函数作为第二个参数传递给该方法相同。

索引.js
async function getNum() { try { const promise = new Promise((resolve, reject) => reject(new Error('test error')), ); await promise; return "This doesn't run"; } catch (err) { // 👇️ this runs throw err; } } getNum() .then(num => { console.log(num); return num; }) .then(undefined, err => { console.log(err.message); // 👉️ "test error" });

很高兴知道该方法的第二个参数是一个在被拒绝.then()时调用的函数。Promise但是,这种语法很少使用。