我想用一些其他的Promise来兑现一个Promise。关键是我真的想在第一个Promise完成后立即访问(仍在等待)第二个Promise。不幸的是,我似乎只能在两个Promise都实现后才能获得第二个Promise的分辨率值。
这是我想到的用例:
var picker = pickFile();
picker.then( // Wait for the user to pick a file.
function(downloadProgress) {
// The user picked a file. The file may not be available just yet (e.g.,
// if it has to be downloaded over the network) but we can already ask
// the user some more questions while the file is being obtained in the
// background.
...do some more user interaction...
return downloadProgress;
}
).then( // Wait for the download (if any) to complete.
function(file) {
// Do something with the file.
}
)
该函数pickFile
显示一个文件选择器,用户可以在其中从他们自己的硬盘驱动器或 URL 中选择一个文件。picker
一旦用户选择了一个文件,它就会返回一个Promise。此时,我们可能仍然需要通过网络下载所选文件。因此,我无法picker
将所选文件作为分辨率值来实现。取而代之的是,picker
应该用另一个Promise来实现,downloadProgress
,这反过来最终会用选定的文件来实现。
为了完整起见,这是该pickFile
函数的模拟实现:
function pickFile() {
...display the file picker...
var resolveP1 = null;
var p1 = new Promise(
function(resolve, reject) {
resolveP1 = resolve;
}
);
// Mock code to pretend the user picked a file
window.setTimeout(function() {
var p2 = Promise.resolve('thefile');
resolveP1(p2); // <--- PROBLEM: I actually want to *fulfill* p1 with p2
}, 3000);
return p1;
}
在标线的问题是,我想履行Promisep1
新的Promisep2
,但我只知道如何解决它。履行和解决之间的区别在于,解决首先检查提供的值p2
是否再次是一个Promise。如果是,则执行p1
将被推迟,直到p2
被执行,然后p1
将执行p2
的分辨率值而不是p2
它本身。
我可以通过围绕 构建一个包装器来解决这个问题p2
,即通过替换该行
resolveP1(p2); // <--- PROBLEM: I actually want to *fulfill* p1 with p2
来自第二个代码示例
resolveP1({promise: p2});
然后,在第一个代码示例中,我必须替换该行
return downloadProgress;
经过
return downloadProgress.promise;
但是当我真正想做的只是履行(而不是解决)一个Promise时,这似乎有点像黑客。
我很感激任何建议。