2024-04-17 21:21:21 发布
网友
我在承诺上有很多困惑。是同步的还是异步的?在
return new Promise (function(resolved,reject){ //sync or async? });
将传递到Promise构造函数的函数将同步运行,但任何依赖于其解析的函数都将被异步调用。即使promise立即解析,任何处理程序都将异步执行(类似于setTimeout(fn, 0))主线程首先运行到最后。在
setTimeout(fn, 0)
无论您的Javascript环境如何-无论您是在节点还是浏览器中,这都是正确的。在
console.log('start'); const myProm = new Promise(function(resolve, reject) { console.log('running'); resolve(); }); myProm.then(() => console.log('resolved')); console.log('end of main block');
承诺本身并不完全是同步或异步的。当您创建一个promise时,传递给它的回调将立即执行,并且在该函数产生之前,其他代码都不能运行。考虑以下示例:
new Promise(function(resolve, reject) { console.log('foo'); }) console.log('bar');
promise之外的代码必须等待promise(同步)内的代码完成才能开始执行。在
也就是说,承诺是处理异步代码的常用方法。promise最常见的用例是表示以异步方式生成或获取的一些值。依赖于该值的逻辑可以通过注册.then()或相关Promise方法来异步地等待该值可用。在
.then()
承诺就像Javascript中的普通类。假设您正在创建自己的Promise实现,那么Promise类大致如下所示。请注意,在您的构造函数中,您期望传递一个方法,该方法将立即将resolve and reject作为参数传递。在
resolve and reject
class Promise { constructor(method) { method(resolve, reject) } resolve() { ... } reject() { ... } then() { ... } }
所以当你做new Promise()时,你只是在创建一个新对象。您的Promise constructor将运行,它将立即调用该方法。所以这就是为什么你的承诺中的代码是同步执行的。在
new Promise()
Promise constructor
如果你在你的函数内部调用了另一个本质上是异步的函数,那么另一个函数将被异步执行,否则,其他的一切都将同步执行。在
如果在promise中有使用then的链,那么只有在第一个promise调用了resolve()之后才会调用它。在
then
resolve()
return new Promise (function(resolve,reject){ const a = 5*5; // sync operation. db.save(a, function callback() { // async operation. resolve() // tells promise to execute `then` block. }); });
将传递到Promise构造函数的函数将同步运行,但任何依赖于其解析的函数都将被异步调用。即使promise立即解析,任何处理程序都将异步执行(类似于
setTimeout(fn, 0)
)主线程首先运行到最后。在无论您的Javascript环境如何-无论您是在节点还是浏览器中,这都是正确的。在
console.log('start'); const myProm = new Promise(function(resolve, reject) { console.log('running'); resolve(); }); myProm.then(() => console.log('resolved')); console.log('end of main block');
;承诺本身并不完全是同步或异步的。当您创建一个promise时,传递给它的回调将立即执行,并且在该函数产生之前,其他代码都不能运行。考虑以下示例:
new Promise(function(resolve, reject) { console.log('foo'); }) console.log('bar');
;promise之外的代码必须等待promise(同步)内的代码完成才能开始执行。在
也就是说,承诺是处理异步代码的常用方法。promise最常见的用例是表示以异步方式生成或获取的一些值。依赖于该值的逻辑可以通过注册
.then()
或相关Promise方法来异步地等待该值可用。在承诺就像Javascript中的普通类。假设您正在创建自己的Promise实现,那么Promise类大致如下所示。请注意,在您的构造函数中,您期望传递一个方法,该方法将立即将
resolve and reject
作为参数传递。在所以当你做
^{pr2}$new Promise()
时,你只是在创建一个新对象。您的Promise constructor
将运行,它将立即调用该方法。所以这就是为什么你的承诺中的代码是同步执行的。在如果你在你的函数内部调用了另一个本质上是异步的函数,那么另一个函数将被异步执行,否则,其他的一切都将同步执行。在
如果在promise中有使用
then
的链,那么只有在第一个promise调用了resolve()
之后才会调用它。在