Javascript然后没有承诺返回价值



也许我没有正确搜索。 没有参数的 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)

最新更新