只是一个简单的澄清问题:JavaScript 是Promise
异步?我读了很多关于Promise
和异步编程(即ajax请求)。如果Promise
不是异步的,我们如何做到这一点?
例如,我有一个函数来包装一个函数f
带参数数组args
里面一个Promise
。没有关于f
本质上是异步的。
function getPromise(f, args) {
return new Promise(function(resolve, reject) {
var result = f.apply(undefined, args);
resolve(result);
});
}
为了使这个异步,我阅读了一些SO帖子并决定setTimeout
是很多人建议使代码非阻塞的方法。
function getPromise(f, args) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
var r = f.apply(undefined, args);
resolve(r);
}, 0);
});
}
这种方法会与setTimeout
努力使代码在a内非阻塞Promise
?
(请注意,我不依赖任何第三方 Promise API,仅依赖浏览器支持的 API)。
我认为你是在误解下工作的。 JavaScript 代码是总是*阻塞;这是因为它在单个线程上运行。 Javascript 中异步编码风格的优点是 I/O 等外部操作不需要阻塞该线程。但处理 I/O 响应的回调仍然处于阻塞状态,并且没有其他 JavaScript 可以同时运行。
* 除非您考虑运行多个进程(或浏览器上下文中的 WebWorkers)。
现在针对您的具体问题:
只是一个简单的澄清问题:JavaScript Promise 是异步的吗?
不,传递到 Promise 构造函数中的回调会立即同步执行,尽管绝对可以启动异步任务,例如超时或写入文件,并等到异步任务完成后再解析 Promise;事实上,这是 Promise 的主要用例。
这种使用 setTimeout 的方法是否可以使 Promise 内的代码非阻塞?
不,它所做的只是改变执行顺序。脚本的其余部分将执行直到完成,然后当没有其他事情可做时,将执行 setTimeout 的回调。
为了澄清:
console.log( 'a' );
new Promise( function ( ) {
console.log( 'b' );
setTimeout( function ( ) {
console.log( 'D' );
}, 0 );
} );
// Other synchronous stuff, that possibly takes a very long time to process
console.log( 'c' );
上面的程序确定性地打印:
a
b
c
D
这是因为 setTimeout 的回调将不会执行,直到主线程无事可做(在记录“c”之后)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)