我试图弄清楚为什么发生以下行为,以及可能带来的好处。使用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
当第二个测试从第二个承诺中获得价值时,为什么第一个测试保留原始承诺中的价值?这是否意味着仅在不将参数传递给函数时才使用
.then(async())
?还是还有一种使用上述语法传递参数的方法? 最佳答案
这不容易看到。
在第一部分中,您具有:
printValue(1)
.then(printValue(2))
.then(function(value){
console.log('then value: ', value);
})
您会看到,您实际上是在调用
printValue(2)
,并且在调用它时会立即执行,它不会等待先前的函数被调用并且它们的promise被解决。尽管printValue
返回一个Promise
,但.then
希望有一个函数在调用时返回一个Promise
(或者只是一个返回值的函数)。因此,在
.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
。