gpt4 book ai didi

javascript - Promises .then(async()) 与 .then(function(){return async()})

转载 作者:行者123 更新时间:2023-12-02 14:01:08 24 4
gpt4 key购买 nike

我试图找出为什么会发生以下行为,以及可能带来的好处。使用 bluebird 作为 promise 实现。

printValue = function (value){
return new Promise(function(resolve, reject){
console.log(value);
resolve(value)
});
}

describe.only('promises', function(){
it('prints values with then', function(done){
printValue(1)
.then(printValue(2))
.then(function(value){
console.log('then value: ', value);
})
.then(done())
});

it('prints values with return', function(done){
printValue(1)
.then(function(){
return printValue(2);
})
.then(function(value){
console.log('return value: ', value);
})
.then(done())
});

});

输出:

1
2
then value: 1

1
2
return value: 2

为什么当第二个测试从第二个 Promise 获取值时,第一个测试保留原始 Promise 的值?这是否意味着仅当您不将参数传递给函数时才使用 .then(async()) ?还是还有一种方法可以使用上述语法传递参数?

最佳答案

这并不容易看出。

在第一部分中,您有:

printValue(1)
.then(printValue(2))
.then(function(value){
console.log('then value: ', value);
})

你看,你实际上是在调用printValue(2),并且当你调用它时它会立即执行,它不会等待前面的函数被调用并且它们的 promise 得到解决。虽然 printValue 返回一个 Promise,但 .then 期望一个函数在调用时返回一个 Promise strong>(或只是一个返回值的函数)。

因此,在 .then(printValue(2)) 中,.then 接收到一个非函数值,它只是忽略它并转到链中的下一个函数。

您可以尝试这个示例来查看:

printValue(1)
.then("hello!")
.then(function (val) {
console.log("got " + val)
});

所以,它实际上和你所拥有的一样,你只是有一个返回一些东西的函数,这里我们只是用一个值替换它!

您也可以尝试这个:

var printValue = function (value){
return new Promise(function(resolve, reject){
console.log("called " , value)
setTimeout(function () {
console.log("resolving ", value);
resolve(value)
}, value*1000);
});
}

你会在这里看到:

printValue(1)
.then(printValue(2))
.then(function (val) {
console.log("got " + val)
});

printValue(1)printValue(2) 同时执行。一秒钟后,printValue(1) 将解析并打印 got 1

关于javascript - Promises .then(async()) 与 .then(function(){return async()}),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40407660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com