Discuss / JavaScript / then串联里setTimeout不同方式导致的不同结果???

then串联里setTimeout不同方式导致的不同结果???

Topic source

ya_ma_dei

#1 Created at ... [Delete] [Delete and Lock User]

function log(txt)

{

    console.log(txt);

}

function multiply(input) {

    return new Promise(function (resolve, reject) {

        log('calculating ' + input + ' x ' + input + '...');

        // setTimeout(resolve, 500, input*input);

        setTimeout(resolve(input*input), 500);

    });

}

function add(input) {

    return new Promise(function (resolve, reject) {

        log('calculating ' + input + ' + ' + input + '...');

        // setTimeout(resolve, 500, input+input);

        setTimeout(resolve(input+input), 500);

    });

}

var p = new Promise(function (resolve, reject) {

    log('start new Promise...');

    resolve(123);

});

p.then(multiply)

 .then(add)

 .then(multiply)

 .then(add)

 .then(function (result) {

    log('Got value: ' + result);

});

结果直接就全部打印出来了,没有延时。

查了setTimeout的用法,第三个参数就是传给第一个参数(函数)的参数,应该和resolve(input*input)一样啊,那为什么写成resolve(input*input)就没有延时效果了呢?

Junes_99994

#2 Created at ... [Delete] [Delete and Lock User]

setTimeout 的第一个参数是回调函数的入口(地址),也就是resolve,不是可执行语句resolve(input*input),resolve一旦执行,会直接将内容传递给Promise对象的PromiseResult,写成可执行语句,setTimeout可能会获得一个未定义或未知的函数入口,具体可以调试看看。


  • 1

Reply