gpt4 book ai didi

javascript - thenable 链是异步的 - Promises 吗?

转载 作者:行者123 更新时间:2023-12-01 02:01:08 25 4
gpt4 key购买 nike

thenable 链接如何异步?看起来从上一个 Promise.then 返回的 promise 正在阻塞(其意图本身就是按照下面给出的示例阻塞)下一个 Promise.then 在链中。我对 Node.js 中的 promises 很陌生。谁能帮助我更好地理解 thenable 链接是如何异步的?
从给定的示例来看,为什么我们不使用同步函数本身,而是使用 thenable 链?

new Promise(function(resolve, reject) {

setTimeout(() => resolve(1), 1000); // (*)

}).then(function(result) { // (**)

alert(result); // 1
return result * 2;

}).then(function(result) { // (***)

alert(result); // 2
return result * 2;

}).then(function(result) {

alert(result); // 4
return result * 2;

});

最佳答案

then 链是异步的,因为 Promise 链后面的代码将在不等待 Promise 达到其已解决状态的情况下执行。

function sleep (ms) {
return new Promise(resolve, setTimeout(resolve, ms));
}

// counts to 3 in 3 seconds, thanks to asynchronicity
sleep(3000).then(() => console.log('3'));
sleep(2000).then(() => console.log('2'));
sleep(1000).then(() => console.log('1'));

给定 Promise 的 then 方法提供了一种附加任何函数的方法应该等待它的返回值(*)。因此, promise 链代表“同步指令序列”但它相对于程序的其余部分是异步的。

function add (i) {
return sleep(1000)
.then(() => { console.log(i+1); return i+1 });
}

// counts to 3 in 3 seconds, thanks to synchronicity along the chain
Promise.resolve(0).then(add).then(add).then(add);

当然,如果只处理线性链,引入异步性是完全没有用的。相关性仅在创建平行链时才会出现。相反,采用这个简单的同步 shell 脚本:

// counts *down* in 6 seconds
sleep 3; echo 3;
sleep 2; echo 2;
sleep 1; echo 1;

请注意, sleep 通常表示等待网络上的某些不同资源,以便清楚地了解异步性的好处。

与此同时,如果没有一种方便的方法来线性化任务并使某些代码片段相互等待,则异步性将无法处理。Promise 是实现这一目标的便捷方式,介于过去的“厄运回调金字塔”和即将到来的 ECMA 2017 async/await 关键字之间,see here例如。

(*) 请注意,始终在中间函数中返回某些内容,否则整个链的其余部分可能会停止等待。

关于javascript - thenable 链是异步的 - Promises 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50572453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com