- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我是 Promises
的新手,我一直在阅读 Q Documentation ,它说:
When you get to the end of a chain of promises, you should either return the last promise or end the chain.
我在我的代码中以Q.Promise
方式定义了一个 Promise,使用以下 console.log
来注销执行跟踪:
function foo(){
return Q.Promise(function(resolve, reject) {
doSomething()
.then(function() {
console.log('1');
return doSomething1();
})
.then(function() {
console.log('2');
return doSomething2();
})
.then(function() {
console.log('3');
return doSomething3();
})
.catch(function(err) {
console.log('catch!!');
reject(err);
})
.done(function() {
console.log('done!!');
resolve();
});
});
}
如果每个 doSomethingN()
都正确执行,一切都会按预期工作,我会得到预期的跟踪:
1
2
3
done!!
但是万一 doSomethingN()
失败了:
foo()
工作正常,因为错误函数回调是每当 reject(err)
发生时运行的函数:
foo().then(function() {/* */}, function(err) {/* 这个运行了!*/});
我得到以下跟踪(即当 doSomething1()
失败时):
1
catch!!
done!!
我最初的想法是:
Okay, let's handle the chaining success and failure in both:
.done()
and.catch()
methods. If everything goes well.done()
's callback will be executed and the promise will be resolved. In case there's an error at any point,.catch()
's callback will be executed and the promise will be rejected - and because of that,done()
won't be executed.
我想我遗漏了一些有关 .done()
工作原理的信息...因为通过查看我的日志记录跟踪,我意识到 .done()
似乎总是在执行 - 无论是否有错误和 .catch()
是否执行 - 这是我没有预料到的。
所以,在那之后,我删除了 .done()
的回调,现在是 foo()
:
错误
时工作我应该重新考虑什么以及我如何/应该如何让它发挥作用?
最佳答案
catch(cb)
只是 then(null, cb)
的别名,实际上您已经修复了 catch
,因此流程自然转向成功导致完成
。
如果你只想修饰 catch 中的错误,你应该在之后重新抛出错误,例如正确的直通可能看起来像:
catch(function (err) {
console.log(err);
throw err;
});
你的例子仍然没有多大意义。当你返回一个 promise 时,你不应该使用 done
。如果你想用内部创建的 promise 链来解析初始化的 promise ,你应该将它解析为:
resolve(doSomething()
.then(function() {
console.log('1');
return doSomething1();
})
....
.then(function() {
console.log('N');
return doSomethingN();
}));
不需要内部错误处理,将其留给您返回的 promise 的消费者。
还有一点。如果在创建新 promise 时您知道它将与其他 promise 一起解决,那么就没有逻辑理由创建这样的 promise ,只需重用您计划解决的 promise 即可。这种错误也被创造为 deferred anti-pattern
关于javascript - promise : is . done() 总是执行,即使 .catch() 是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33947395/
如何从 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
我是一名优秀的程序员,十分优秀!