- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想用其他 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 中选择一个文件。它返回一个 promise picker
一旦用户选择了一个文件,它就会完成。此时,我们可能还是要通过网络下载选中的文件。因此,我无法完成 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;
}
标记行中的问题是我想履行 promise p1
带着新的 promise p2
,但我只知道如何解决它。 difference between fulfilling and resolving是解析首先检查提供的值是否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 时,这似乎有点不合理。
如果有任何建议,我将不胜感激。
最佳答案
除了我已经在问题中描述的解决方法之外,似乎没有其他解决方案。供将来引用,如果您想履行(而不是解决) promise p
值为 val
, 其中val
是另一个 promise ,然后只需调用 p
的 promise 解析函数带参数 val
不会按预期工作。这会导致 p
被“锁定”在 val
的状态, 这样 p
将用 val
完成一次的分辨率值val
已满足(参见 spec )。
相反,包装 val
在另一个对象中解析 p
与那个对象:
var resolveP; // Promise resolution function for p
var p = new Promise(
function(resolve, reject) {
resolveP = resolve;
}
);
function fulfillPwithPromise(val) { // Fulfills p with a promise val
resolveP({promise: val});
}
p.then(function(res) {
// Do something as soon as p is fulfilled...
return res.promise;
}).then(function(res) {
// Do something as soon as the second promise is fulfilled...
});
如果您已经知道 val
,则此解决方案有效是一个 promise 。如果您不能对 val
做出任何假设的类型,那你好像倒霉了。您要么必须始终将 promise 解析值包装在另一个对象中,要么您可以尝试检测是否 val
有一个字段 then
类型为“函数”并有条件地包装它。
也就是说,在某些情况下,promise 解析的默认行为实际上可能会产生预期的效果。因此,如果您确定要实现而不是解决第一个 promise 与第二个 promise ,则仅使用上述解决方法。
关于javascript - 用另一个 promise 履行(不解决) promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32168194/
我是一名优秀的程序员,十分优秀!