- 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/
如何从 promise 中退出 promise ? perl6 文档没有提供简单的方法。例如: my $x = start { loop { # loop forever until "qui
我的用户 Controller 中有一个索引操作,其中我试图连续做两件事,并且在它们都有机会完成之前不执行所需的 res.json() 方法。 我有一个加入用户的友谊加入模型。一列是 friender
请帮我解释一下为什么日志结果有两种不同: 方式 1:每 1 秒顺序记录一次 方式 2:1 秒后记录所有元素。 // Way 1 let sequence = Promise.resolve(); [1
我的问题很简单。 Promise.all() 方法可以返回 Promise 吗?让我解释一下: function simpleFunction() { let queue = [];
我正在使用 Promise 从存储中读取文件并转换为 base64 字符串。我有图像数组,使用 RNFS 读取图像 const promise_Images = _Images.map(async (
如果使用非空数组调用 Promise.all 或 Promise.race,它们将返回一个待处理的 Promise: console.log(Promise.all([1])); // prints
Promise.all 是否可以在没有包装 promise 的情况下返回链的最后一个值? 如果不使用 await,它在我的上下文中不起作用 没有包装的例子: function sum1(x){ r
我一直在玩 promise,通常能想出如何处理好它们,但在这种情况下,我不知道如何删除一个 promise-wrapping level。 代码如下: let promise2 = promise1.
考虑以下嵌套的Promises结构: const getData = async() => { const refs = [{ name: "John33", age: 3
我已经阅读了 Promise/A+ 规范,但据我了解,还有诸如 Promise/A 和 Promise 之类的东西。它们之间有什么区别? Promise 和 Promise/A 规范也是如此吗?如果是
当我运行以下代码时: my $timer = Promise.in(2); my $after = $timer.then({ say "2 seconds are over!"; 'result'
以下简单的 promise 是发誓的,我不允许打破它。 my $my_promise = start { loop {} # or sleep x; 'promise re
我正在尝试扩展Promise: class PersistedPromise extends Promise { } 然后在派生类上调用静态resolve以直接创建一个已解决的Promise: Per
我有两个返回 promise 的函数,我独立使用它们作为: getLocal().then(...) 和 getWeb().then(...) 但是现在我遇到了一个奇怪的问题: 1) 我需要第三个
我不知道 promise.all 解决方案中的 promise.all 是否是一个好的实践。我不确定。 我需要从一组用户获取信息,然后通过此信息响应,我需要发送消息通知。 let userList =
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
我一直在尝试使用 queueMicrotask() 函数,但我没有弄清楚当回调是微任务时回调的优先级如何。查看以下代码: function tasksAndMicroTasks() { const
今年早些时候,我在 Pharo Smalltalk 参与了一个 promise 项目。这个想法是为了实现以下行为: ([ 30 seconds wait. 4 ]promiseValue )then:
大家好,提前感谢您的帮助。 下面是我正在尝试做的事情 function1(){ throw some error(); } function2() { // dosomething suc
我有以下未解析的代码。f2 解决了,所以我不会添加该代码,它是 f1 我有问题。 我调用函数,它到达最里面如果,它调用函数“find”,它执行函数 findId,完美返回 Id,然后执行 editId
我是一名优秀的程序员,十分优秀!