我承诺很多困惑。这是同步还是异步?
return new Promise (function(resolved,reject){
//sync or async?
});
答案 0 :(得分:9)
将传递到 Promise构造函数的函数同步运行,但依赖于其解析的任何内容都将异步调用。即使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');

答案 1 :(得分:3)
Promise本身并不是完全同步或异步的。当您创建一个promise时,您传递给它的回调会立即执行,并且在该函数产生之前不能运行其他代码。请考虑以下示例:
new Promise(function(resolve, reject) {
console.log('foo');
})
console.log('bar');
promise之外的代码必须等待promise(同步)中的代码在开始执行之前完成。
也就是说,promises是处理异步代码的常用方法。 promise的最常见用例是表示以异步方式生成或获取的某些值。依赖于该值的逻辑可以通过使用.then()
或相关的Promise方法注册回调来异步等待,直到值可用。
答案 2 :(得分:0)
创建诺言并回电时 该回调将立即执行(同步)
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")
答案 3 :(得分:0)
承诺就像Javascript中的普通类。假设您正在创建自己的Promise实现,则您的promise类将大致如下所示。请注意,在构造函数中,您希望传递一个方法,您将立即调用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
获得了诺言,那么只有在您的第一个诺言调用了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.
});
});
答案 4 :(得分:0)
此代码使其更清晰:
console.log("0");
new Promise((resolve, reject) => {
console.log("1");
resolve();
}).then(() => {
console.log("2");
});
console.log("3");
代码显示: 0 1 3 2
因此,then
是异步运行的,而主回调函数是同步运行的。
答案 5 :(得分:0)
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")
答案 6 :(得分:0)
我认为其他答案都不准确。
new Promise (executor_function)
这里的 executor_function 会作为 Promise 初始化的一部分立即运行 --- 这意味着 Promise init 将同步执行,但并不意味着 executor_function 内部的代码将同步运行,而是 executor_function 内部的代码将异步运行。
new Promise ((resolve, reject) => {
.... // run asynchronously
})