📅  最后修改于: 2023-12-03 15:16:10.952000             🧑  作者: Mango
在 JavaScript 程序中,创建同步暂停有时候是必要的。正常情况下 JavaScript 是单线程的,无法在执行中途暂停等待其它任务完成而继续执行。但有时我们确实需要等待某个结果再执行后续的操作。下面介绍几种创建同步暂停的最佳方法。
Promise 是 JavaScript 中非常常用的异步编程方式,但是 Promise 也可以用于同步编程,通过 Promise 的 then 方法来实现暂停等待结果再执行后续代码的效果。
function foo() {
return new Promise((resolve, reject) => {
// 需要暂停等待的异步操作
setTimeout(() => {
resolve('bar');
}, 1000);
});
}
async function main() {
const result = await foo();
console.log(result);
// rest of the code here
}
main();
上面的代码中,通过 async 函数和 await 关键字实现同步暂停效果,main 函数等待 foo 函数返回 Promise 对象中的结果。注意,当使用 await 时,函数必须声明为 async 函数。
Generator 是 ES6 引入的一种新的语法结构,可以用于创建可暂停的函数,通常是作为异步编程的工具,但也可以用于同步编程,通过 yield 实现暂停等待结果。
function* foo() {
// 等待结果
const res = yield new Promise((resolve) => {
// 异步操作
setTimeout(() => {
resolve('bar');
}, 1000);
});
console.log(res);
// rest of the code here
}
const generator = foo();
generator.next().value.then((res) => {
generator.next(res); // 执行后续操作
});
上面的代码中,通过 Generator 函数的特性实现同步暂停的效果。Generator 函数返回的是一个可暂停的迭代器对象,通过调用 next 方法可以执行迭代器中的代码。由于 Generator 函数可以返回 Promise 对象,我们可以在函数内部等待异步操作完成再继续执行后续代码。
async/await 和 Promise 可以使用组合的方式以更简洁的方式实现同步暂停的效果。
async function foo() {
// 等待结果
const res = await new Promise((resolve) => {
// 异步操作
setTimeout(() => {
resolve('bar');
}, 1000);
});
console.log(res);
// rest of the code here
}
foo();
上面的代码中,同样使用 async/await 实现暂停等待结果,但使用了更简洁的方式:通过 await 直接等待一个 Promise 对象的结果。
本文介绍了三种实现 JavaScript 程序同步暂停的方法:Promise、Generator 和 async/await 和 Promise 的组合。程序员可以根据需要选择合适的方法实现程序的同步暂停效果。