// 意味着等待1000毫秒 可以从promise async await角度实现
function sleep(ms) {
return new Promise(resolve => { setTimeout(resolve, ms) })
}
async function example() {
console.log("!");
await sleep(1000);
console.log("222")
}
example();
在这段代码中,sleep 函数返回一个 Promise 对象。Promise 构造函数接受一个参数,这个参数是一个函数,通常称为 executor 函数。这个 executor 函数接受两个参数,通常称为 resolve 和 reject。当 executor 函数被执行时,它通常会开始某个异步操作,并在操作完成时调用 resolve 或 reject 函数来指示 Promise 的状态。
在 sleep 函数中,executor 函数使用 setTimeout 来模拟一个异步操作,等待指定的毫秒数后调用 resolve 函数,将 Promise 状态设置为已解决。
因此,当你调用 sleep 函数时,它会创建一个等待指定时间后才解决的 Promise 对象。
在 example 函数中,由于 sleep 函数返回的是一个 Promise,我们可以使用 await 关键字来等待这个 Promise 的解决。
await 关键字可以暂停函数的执行,直到 Promise 解决为止。
这就是为什么在 example 函数中使用 await sleep(1000);
可以使函数等待 1000 毫秒后再继续执行。 因此,使用 await 可以在异步操作完成后继续执行后续的代码,等同于在 Promise 被解决时调用 resolve 函数。
这两行代码在处理上是不同的,因为 parseInt 函数的行为和预期可能会导致不同的结果。
1.["1", "2", "3"].map(parseInt): 这行代码的执行会导致意外的结果。map 方法会将数组中的每个元素作为参数传递给 parseInt 函数,并调用它。
parseInt 函数接受两个参数,第一个参数是要转换的字符串,第二个参数是进制数。
但是,map 方法传递的第二个参数是元素的索引而不是进制数。
因此,实际执行的是 parseInt("1", 0), parseInt("2", 1), parseInt("3", 2)。
其中 parseInt("1", 0) 的结果是 1,
parseInt("2", 1) 的结果是 NaN,因为基数为 1 时,无法解析数字 2,
parseInt("3", 2) 的结果是 NaN,因为无法解析 3 为二进制数。
所以最终的结果是 [1, NaN, NaN]。 2.["1", "2", "3"].map(num => parseInt(num)): 这行代码使用了箭头函数,将每个元素作为参数传递给 parseInt 函数,并将结果放入新的数组中。
因为箭头函数没有第二个参数,
所以 parseInt 只接收到一个参数,即要转换的字符串。
这样,parseInt 函数会按照十进制解析每个字符串,结果会是 [1, 2, 3]。