有许多关于如何在使用JavaScript Promise进行编程时使用"then"和"catch"的教程.但是,所有这些教程似乎都错过了重要的一点:从then/catch块返回以打破Promise链.让我们从一些同步代码开始来说明这个问题:
try {
someFunction();
} catch (err) {
if (!(err instanceof MyCustomError))
return -1;
}
someOtherFunction();
Run Code Online (Sandbox Code Playgroud)
本质上,我正在测试一个捕获的错误,如果不是错误,我希望我将返回调用者,否则程序继续.但是,这种逻辑不适用于Promise:
Promise.resolve(someFunction).then(function() {
console.log('someFunction should throw error');
return -2;
}).catch(function(err) {
if (err instanceof MyCustomError) {
return -1;
}
}).then(someOtherFunction);
Run Code Online (Sandbox Code Playgroud)
这个逻辑用于我的一些单元测试,我希望函数以某种方式失败.即使我将catch更改为then块,我仍然无法打破一系列链接的Promises,因为从then/catch块返回的任何内容都将成为沿着链传播的Promise.
我想知道Promise是否能够实现这个逻辑; 如果没有,为什么?对我来说,Promise链永远不会被破坏是很奇怪的.谢谢!
编辑于2015年8月16日:根据到目前为止给出的答案,由then块返回的被拒绝的Promise将通过Promise链传播并跳过所有后续块,直到被捕获(处理).这种行为很好理解,因为它只是模仿以下同步代码(方法1):
try {
Function1();
Function2();
Function3();
Function4();
} catch (err) {
// Assuming this err is thrown in Function1; Function2, Function3 and Function4 will not be executed
console.log(err);
}
Run Code Online (Sandbox Code Playgroud)
但是,我要问的是同步代码中的以下场景(方法2):
try {
Function1();
} catch(err) {
console.log(err); // Function1's error …Run Code Online (Sandbox Code Playgroud) 当我在Windows机器上开发Ruby on Rails时,我需要使用cygwin来模拟Unix命令提示符.现在的问题是,每次当我打开cygwin的终端的时候,我把这个目录C:/ Cygwin的/家/ my_user_name而不是Windows的默认用户目录C:/用户/ my_user_name.
有谁知道如何将cygwin的默认主目录设为Windows默认的C:/ Users/my_user_name目录?
我已经浏览了Stack Overflow中提供的各种解决方案,但它们都不适合我,"mkpasswd"也不起作用.这与我的操作系统版本有什么关系,或者其他什么?
我使用的是cygwin 1.7.5,我的操作系统是Windows 7 Business 64位.
我一直试图弄清楚如何使用JAX-RS很长一段时间.我从最基本的概念开始,然后逐渐理解注释风格的编程,@ Path,@ Get,@ Post等的含义.
据我所知,对于很多地方提到的内容,JAX-RS是一个专注于将Java注释应用于普通Java对象的框架(第27页,Bill Burke,RESTful Java).
然后我超越了这一点感到困惑.如果JAX-RS本身是一个定义处理注释的API以实现RESTful Web服务的框架,那么"JAX-RS的实现"的含义是什么,例如"Jersey"和"JBoos Resteasy".JAX-RS顶部的另一层?我们为什么需要它们?
有人能为我提供一些见解吗?非常感谢!!!
我不是java和C#的新手.我以为我理解变量范围的概念直到最近我在一次采访中被问到这个问题:
public class Q{ //starting y scope
static int x = 11;
private int y = 33; // Just added a “private” modifier to make it clearer.
public static void main(String args[]){
Q q = new Q();
q.call(5);
}
public void call(int x){
Q q = new Q();
this.x = 22;
y = 44;
System.out.println("Output: " + Q.x);
System.out.println("Output: " + q.x);
System.out.println("Output: " + q.y);
}
} //ending y scope
Run Code Online (Sandbox Code Playgroud)
定义此程序的输出.
我在采访中回答了这个问题,输出结果是运行时异常.根据我的理解,y被声明为private,而实例方法call()正试图访问另一个Q类实例的实例私有变量y.怎么会发生这种情况!?然而,错误地回答这个问题并没有太多影响我的采访,因为这是一种"棘手的基本"问题.但是,错误地回答意味着我多年的Java经验需要康复,这太糟糕了!
有人可以帮我解决这个问题吗?我将非常感激!
我在 Git 中有两个主要分支:master和dev.
我的分支结构如下所示:
B-->E-->F-->G (master branch)
B-->C-->D-->H-->I-->J-->K (dev branch)
Run Code Online (Sandbox Code Playgroud)
之前,我进行了合并,master并dev有一个共同的母公司B。
在提交E,F并G掌握的,我删除了一些文件(说foo和bar)不正确,而他们在提交仍然存在C起在dev分支。
结果,当我执行三向合并以加入G并K创建 commit 时L,L不再包含 foo 和 bar !Git 没有以任何方式通知我他们的失踪。
在我看来,由于E,F并G进行了简单的重播后提交C因此foo而bar都不见了。
Git 合并的这种行为对我来说很奇怪。因为我无法知道是否有人从另一个分支删除了一些文件。
我不应该至少在合并时收到有关任何冲突修改的通知吗?
当我说"直接数据库连接"时,我的意思是使用类似JDBC的驱动程序在活动上下文中调用和运行远程数据库查询,就像使用SQLite数据库存储本地参数一样.
直到我意识到我几乎无法在互联网上找到关于这种数据库连接方式的任何教程或文档,我想,无论大多数(如果不是所有的)Android设备都有不稳定的Wi-Fi/3G网络,连接到数据库应该这样做.
即使在Android SDK中,android.database.sqlite本质上也只支持本地数据库访问(aka ).并且在java.sql API 的描述中声明,您必须提供自己的JDBC驱动程序才能使用此API.
然后我开始意识到,如果我直接连接数据库的意图在Android领域首先是错误的.
我读过很多书,维基和论坛,包括Stack Overflow上提供的大量答案.在我看来,许多人都专注于完成某项工作,而且过去的讨论始于"如何为我的Android设备设计RESTful Web服务?".但是,我需要彻底了解!我还需要原始Android开发人员的权威引用.