gpt4 book ai didi

javascript - 用另一个 promise 履行(不解决) promise

转载 作者:数据小太阳 更新时间:2023-10-29 04:50:58 26 4
gpt4 key购买 nike

我想用其他 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com