我学习了Promises(来自this shim的vanilla es6 promises)我有两个函数,每个函数都返回一个新的Promise和一个名为magic()
的第三个函数,它调用2函数并返回一个Promise。
示例代码:
var CreatorX = {
"create": function() {
var p = new Promise(function(resolve, reject) {
window.setTimeout(function() {
window.console.log("created");
resolve(22);
}, 100);
});
return p;
}
};
var CreatorY = {
"create": function(id) {
window.console.log("id " + id);
var p = new Promise(function(resolve, reject) {
window.setTimeout(function() {
resolve(2244);
}, 5);
});
return p;
}
};
这就是魔术:
function magic() {
return CreatorX.create().then(function(d) {
CreatorY.create(d); // shouldn't it be 'return CreatorY...'?
});
}
var r = magic();
r.then(function() {
console.log("Done");
}, function(err){console.error("oops")});
我的问题是,为什么这有效?我在魔术函数中的CreatorY.create(d)
行没有返回语句,但似乎有效。 return
应该在那里吗?这是巧合吗?
答案 0 :(得分:2)
当您从Promise函数返回一些内容时,将使用您返回的值解析promise。承诺函数的返回值将传递给链式promise函数。
在您的情况下,您没有明确地返回任何内容。因此,JavaScript将解决undefined
的承诺,并且
function() {
console.log("Done");
}
功能。但是你忽略了先前承诺的已解决价值。如果您确实想要使用它,请将功能更改为
function(result) {
console.log(result);
}
现在您将能够看到实际解决的值。
答案 1 :(得分:1)
您的函数magic()
会返回一个承诺,以便CreatorY.create(d)
调用运行,但当您通过调用r.then(...
return CreatorX.create().then(...
运行承诺时