在返回之前等待 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
但是,这种语法很少使用。