Promise在nodejs中是同步还是异步
Promise is synchronous or asynchronous in node js
我对承诺有很多困惑。它是同步的还是异步的?
return new Promise (function(resolved,reject){
//sync or async?
});
您传递 到 Promise 构造函数的函数同步运行,但任何依赖于其解析的内容都将被异步调用。即使承诺立即解决,任何处理程序都将异步执行(类似于您 setTimeout(fn, 0)
时)- 主线程首先运行到结束。
无论您的 Javascript 环境如何 - 无论您使用的是 Node 还是浏览器,都是如此。
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 内的代码(同步)完成才能开始执行。
也就是说,promises 是处理异步代码的常用方法。 promise 最常见的用例是表示以异步方式生成或获取的某些值。通过使用 .then()
或相关的 Promise 方法注册回调,依赖于该值的逻辑可以异步等待直到该值可用。
当您创建承诺并将回调传回给它时
该回调将立即执行(同步)
const promise= new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
console.log("result");
})
console.log("global log")
但是当你通过 .then() 方法解决它时,它会以异步方式运行
例如:
const promise = new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
resolve("fullfiled")
})
promise.then(v => {
console.log(v)
})
console.log("global log")
Promise 与 Javascript 中的 class 一样。假设您正在创建自己的 Promise 实现,您的 promise class 大致如下所示。请注意,在您的构造函数中,您期望传递一个方法,您立即调用传递 resolve and reject
作为参数。
class Promise {
constructor(method) {
method(resolve, reject)
}
resolve() { ... }
reject() { ... }
then() { ... }
}
所以当您执行 new Promise()
时,您只是在创建一个新对象。您的 Promise constructor
将 运行,它会立即调用该方法。这就是为什么你的 promise 中的代码会同步执行的原因。
return new Promise (function(resolved,reject){
//sync or async?
});
如果在您的函数中调用另一个本质上是异步的函数,那么另一个函数将异步执行,否则,其他所有内容都会同步执行。
如果您使用 then
在 promise 中创建链,那么它只会在您的第一个 promise 调用 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.
});
});
这段代码更清楚:
console.log("0");
new Promise((resolve, reject) => {
console.log("1");
resolve();
}).then(() => {
console.log("2");
});
console.log("3");
代码打印: 0 1 3 2
因此,then
异步运行,而主回调函数同步运行。
const promise = new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
console.log("check")
resolve("fullfiled")
})
promise.then(v => {
console.log(v)
})
console.log("global log")
我发现其他答案都不准确。
new Promise (executor_function)
这里的executor_function会运行立即作为Promise初始化的一部分---这意味着Promise init会同步执行,但并不意味着executor_function里面的代码一定会运行是同步的,相反,executor_function里面的代码也可以是运行异步的,例如:
new Promise ((resolve, reject) => {
setTimeout(resolve, 1000); // wait 1s
})
我对承诺有很多困惑。它是同步的还是异步的?
return new Promise (function(resolved,reject){
//sync or async?
});
您传递 到 Promise 构造函数的函数同步运行,但任何依赖于其解析的内容都将被异步调用。即使承诺立即解决,任何处理程序都将异步执行(类似于您 setTimeout(fn, 0)
时)- 主线程首先运行到结束。
无论您的 Javascript 环境如何 - 无论您使用的是 Node 还是浏览器,都是如此。
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 内的代码(同步)完成才能开始执行。
也就是说,promises 是处理异步代码的常用方法。 promise 最常见的用例是表示以异步方式生成或获取的某些值。通过使用 .then()
或相关的 Promise 方法注册回调,依赖于该值的逻辑可以异步等待直到该值可用。
当您创建承诺并将回调传回给它时 该回调将立即执行(同步)
const promise= new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
console.log("result");
})
console.log("global log")
但是当你通过 .then() 方法解决它时,它会以异步方式运行 例如:
const promise = new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
resolve("fullfiled")
})
promise.then(v => {
console.log(v)
})
console.log("global log")
Promise 与 Javascript 中的 class 一样。假设您正在创建自己的 Promise 实现,您的 promise class 大致如下所示。请注意,在您的构造函数中,您期望传递一个方法,您立即调用传递 resolve and reject
作为参数。
class Promise {
constructor(method) {
method(resolve, reject)
}
resolve() { ... }
reject() { ... }
then() { ... }
}
所以当您执行 new Promise()
时,您只是在创建一个新对象。您的 Promise constructor
将 运行,它会立即调用该方法。这就是为什么你的 promise 中的代码会同步执行的原因。
return new Promise (function(resolved,reject){
//sync or async?
});
如果在您的函数中调用另一个本质上是异步的函数,那么另一个函数将异步执行,否则,其他所有内容都会同步执行。
如果您使用 then
在 promise 中创建链,那么它只会在您的第一个 promise 调用 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.
});
});
这段代码更清楚:
console.log("0");
new Promise((resolve, reject) => {
console.log("1");
resolve();
}).then(() => {
console.log("2");
});
console.log("3");
代码打印: 0 1 3 2
因此,then
异步运行,而主回调函数同步运行。
const promise = new Promise(function(resolve, reject) {
//doing some logic it gonna be executed synchronously
console.log("check")
resolve("fullfiled")
})
promise.then(v => {
console.log(v)
})
console.log("global log")
我发现其他答案都不准确。
new Promise (executor_function)
这里的executor_function会运行立即作为Promise初始化的一部分---这意味着Promise init会同步执行,但并不意味着executor_function里面的代码一定会运行是同步的,相反,executor_function里面的代码也可以是运行异步的,例如:
new Promise ((resolve, reject) => {
setTimeout(resolve, 1000); // wait 1s
})