也许我没有正确搜索。 没有参数的 then 函数不会阻塞吗? 例如,你有一个承诺:
someFunc = () => {
return new Promise((res,rej)=>{
somethingAsync(input).then((val) => res(val))
})
}
在我们函数的以下实现中。 两者都会等待某个 Func 返回值吗?
someFunc().then(dosomethingafter())
someFunc().then((val) => dosomethingafter())
在JS中,表达式被急切地计算。这意味着每个函数参数在传递之前都会被计算。
someFunc().then(dosomethingafter())
实际上与
var tmp = dosomethingafter();
someFunc().then(tmp)
因此,在调用函数someFunc().then(dosomethingafter())
之前调用函数then
,并作为参数传递其返回结果。
你可能的意思是
someFunc().then(dosomethingafter)
请注意,没有函数调用 - 只将对函数的引用传递给then
然后在解析承诺时调用它。
通过示例更容易说明这一点。您的第一个案例:
const fn = (text) => {console.log(text)}
const waiter = () => new Promise((resolve, reject) => {
return setTimeout(() => {
fn('resolved')
resolve()
}, 2000)
})
waiter().then(fn('done'))
请注意,fn
首先被执行,被评估,然后waiter
被执行。
让我们看第二种情况:
const fn = (text) => {console.log(text)}
const waiter = () => new Promise((resolve, reject) => {
return setTimeout(() => {
fn('resolved')
resolve()
}, 2000)
})
waiter().then(() => fn('done'))
现在请注意,我们先得到resolved
,然后done
。
因此,您的问题的答案是肯定的,在这两种情况下,我们都将等待并执行someFunc
或在上面的示例中执行waiter
。
主要区别在于您的dosomethingafter
何时执行。
在第一种情况下,它是立即的,然后在waiter
中传递。
在第二种情况下,你有一个有效的承诺链,它将首先被执行,然后一旦完成(并且由于fn
充当then
的函数处理程序(,它将dosomethingafter
执行。
pass doSomethingAfter First Class
const handleAsJson = response => response.json()
fetch(url)
.then(handleAsJson)
.then(console.log)