Heim > Fragen und Antworten > Hauptteil
äußerte Verwirrung über den Unterschied zwischen setTimeout(resolve('World'), ms);
与 setTimeout(resolve, ms, 'World');
.
function timeout(ms = 100) {
/*1. 为何这种写法,立即返回数据而不是等到过了 ms 后才返回*/
// return new Promise((resolve, reject) => {
// setTimeout(resolve('World'), ms);
// });
/*2. 为何这种写法,等到过了 ms 后才返回*/
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'World');
});
}
timeout(1000)
.then(value => {
console.log(`Hello, ${value}`);
})
.catch(err => {
console.error(err);
});
習慣沉默2017-06-12 09:23:50
就是func()和func的区别,setTimeout的第一个参数是func,如果用func()相当于其返回值为第一个参数。
举个例子:
function test(){
console.log('this is test!');
return function () {
console.log('this is return!');
}
}
setTimeout(test(), 1000);
大致相当于:
console.log('this is test!');
setTimeout(function () {
console.log('this is return!');
}, 1000);
淡淡烟草味2017-06-12 09:23:50
和Promise
无关,当你执行到setTimeout(resolve('World'), ms);
时,浏览器就已经自动执行了resolve('World')
,举个例子来说:
var test = function(value){
console.log(value);
}
setTimeout(test('hello') , 2000);
此时test
立即执行。
曾经蜡笔没有小新2017-06-12 09:23:50
(为什么总有这么多人不理解)
setTimeout(resolve, ms, 'World');
其中 resolve
是一个函数,因此这段的行为正常setTimeout(resolve('World'), ms);
其中 resolve('World')
不是函数,是什么决定于 resolve
的返回值类型,但无论如何,resolve
在 注册 timer 的时候 就已经执行了,自然也就没有延迟效果了
巴扎黑2017-06-12 09:23:50
====================================
以下答案作废:没仔细审题。。
大致没什么不同之处。
只是!!!!
IE浏览器对setTimeout(resolve, ms, 'World')
的支持性有问题。(貌似是IE <= 9 都会出问题)
参考资料:(看里面黄色背景的Note)
WindowOrWorkerGlobalScope.setTimeout()