我试图通过在业余爱好项目中使用它们来更好地理解承诺,但我不明白为什么它从承诺链的第一个.then
而不是最后一个承担价值。换句话说,我如何在promise中运行一些任意代码,然后在最后,将值返回到该promise的外部?谢谢!我期望值'x',但程序返回'b'。
var Promise = require('bluebird')
Promise.resolve('x')
.then(function (user) {
return Promise.resolve('c').then(function (roll) {
return Promise.resolve('a').then(function (user) {
return Promise.resolve('b')
})
.then(Promise.resolve('x'))
})
})
.then(function (output) {
console.log(output)
})
答案 0 :(得分:4)
承诺链的意义在于它允许then
回调转换结果,这是您所看到的。如果您不想要转换结果,则必须返回收到的then
回调值,以便传播它,或继续使用原始承诺而不是使用由then
返回的一个。
请记住then
创建承诺,该承诺根据您从then
回调中返回的内容进行解析。因此,如果不是所有Promise.resolve
次呼叫,则不需要大多数。
一些简单的示例(在浏览器中需要Promise
支持):
// Prints:
// First callback got a
// Second callback got A
Promise.resolve("a")
.then(function(value) {
console.log("First callback got " + value);
return value.toUpperCase();
})
.then(function(value) {
console.log("Second callback got " + value);
return value.toUpperCase();
});
// Contrast that with using the same promise for both `then` calls:
// Prints:
// Third callback got a
// Fourth callback got a
setTimeout(function() {
var p = Promise.resolve("a");
p.then(function(value) {
console.log("Third callback got " + value);
return value.toUpperCase();
});
p.then(function(value) {
console.log("Fourth callback got " + value);
return value.toUpperCase();
});
}, 100);

答案 1 :(得分:3)
我相信承诺只能解决一次。其余的将被忽略。通过链接then
来实现解析值的进一步变异。要获得您正在寻找的结果(x
的输出),您的代码将是:
var Promise = require('bluebird')
Promise.resolve('x')
.then(function (doesnotmatter) {
return Promise.resolve('c').then(function (alsodoesnotmatter) {
return Promise.resolve('a').then(function (noneofthismatters) {
return Promise.resolve('b')
})
.then(function(){return 'x'})
})
})
.then(function (output) {
console.log(output) // 'x'
})
使示例更清晰:
var Promise = require('bluebird')
Promise.resolve('y')
.then(function (y) {
// y == 'y'
return 'c';
})
.then(function(c) {
// c == 'c'
return 'a';
})
.then(function(a) {
// a == 'a'
return 'b';
})
.then(function(b) {
// b == 'b'
return 'x';
}).
then(function(x) {
console.log(x); // output is 'x';
});