在Javascript中,假设我想在异常发生时执行一些清理,但让异常继续向上传播,例如:
try {
enterAwesomeMode();
doRiskyStuff(); // might throw an exception
} catch (e) {
leaveAwesomeMode();
throw e;
}
doMoreStuff();
leaveAwesomeMode();
Run Code Online (Sandbox Code Playgroud)
这段代码的问题在于捕获和重新抛出异常会导致到那一点的堆栈跟踪信息丢失,因此如果随后再次捕获异常,堆栈上的堆栈更高,堆栈跟踪只会下降到re -扔.这很糟糕,因为它意味着它不包含实际抛出异常的函数.
事实证明,try..finally具有相同的行为,至少在Chrome中(也就是说,它不是精确地重新抛出问题,而是存在任何异常处理程序块.)
有没有人知道在Javascript中重新抛出异常但保留与之关联的堆栈跟踪的方法?如果不这样做,那么建议其他方法来添加异常安全的清理处理程序,同时在发生异常时捕获完整的堆栈跟踪?
感谢任何指针:)
javascript callstack exception-handling exception stack-trace
jQuery高度关注DOM,并提供了一个很好的抽象.在这样做的过程中,它利用了昨天刚刚打动我的各种众所周知的设计模式.一个明显的例子是Decorator模式.jQuery对象围绕常规DOM对象提供新的和附加的功能.
例如,DOM具有本机insertBefore方法,但没有相应的insertAfter方法.有各种各样的实现可以填补这个空白,jQuery就是这样一个提供这个功能的库:
$(selector).after(..)
$(selector).insertAfter(..)
Run Code Online (Sandbox Code Playgroud)
在jQuery中大量使用了Decorator模式的许多其他示例.
还有哪些其他大小设计模式的例子都是图书馆本身的一部分?另外,请提供模式用法的示例.
将此作为社区维基,因为我相信人们喜欢jQuery的各种各样的东西可以追溯到众所周知的设计模式,只是它们通常不被模式的名称所引用.这个问题没有一个答案,但对这些模式进行编目将提供对图书馆本身的有用见解.
我试图找到多个数组之间的交集值.
例如
code1 = [1,2,3]
code2 = [2,3,4]
code3 = [0,2,6]
Run Code Online (Sandbox Code Playgroud)
结果将是2
我知道在PHP中你可以用array_intersect做到这一点
我希望能够轻松添加额外的数组,所以我真的不想使用多个循环
有任何想法吗 ?
谢谢,亚历克斯
Rails有一个has_one :through关联,通过第二个模型帮助建立与第三个模型的一对一关联.除了建立一个快捷方式关联之外,它的实际用途是什么,否则这将是一个额外的步骤.
以Rails 指南为例:
class Supplier < ActiveRecord::Base
has_one :account
has_one :account_history, :through => :account
end
class Account < ActiveRecord::Base
belongs_to :supplier
has_one :account_history
end
class AccountHistory < ActiveRecord::Base
belongs_to :account
end
Run Code Online (Sandbox Code Playgroud)
可能允许我们做类似的事情:
supplier.account_history
Run Code Online (Sandbox Code Playgroud)
否则将达到:
supplier.account.history
Run Code Online (Sandbox Code Playgroud)
如果它只是为了更简单的访问,那么从技术上讲,可能存在一对一的关联,它将模型与通过n-1模型的某个第n个模型连接起来,以便于访问.除了快捷方式之外,还有什么我想念的吗?
我对这段代码感到非常困惑:
var closures = [];
function create() {
for (var i = 0; i < 5; i++) {
closures[i] = function() {
alert("i = " + i);
};
}
}
function run() {
for (var i = 0; i < 5; i++) {
closures[i]();
}
}
create();
run();
Run Code Online (Sandbox Code Playgroud)
根据我的理解,它应该打印0,1,2,3,4(这不是闭包的概念吗?).
而是打印5,5,5,5,5.
我试过Rhino和Firefox.
有人可以向我解释这种行为吗?Thx提前.
在Javascript中是否有类似于ruby的数组[n..m]?
例如:
>> a = ['a','b','c','d','e','f','g']
>> a[0..2]
=> ['a','b','c']
Run Code Online (Sandbox Code Playgroud)
谢谢
我正在处理一些我从其他人手中接过的HTML和Javascript代码.该页面每十秒重新加载一个数据表(通过异步请求),然后使用一些DOM代码重新构建表.有问题的代码看起来像这样:
var blah = xmlres.getElementsByTagName('blah');
for(var i = 0; i < blah.length; i++) {
var td = document.createElement('td');
var select = document.createElement('select');
select.setAttribute("...", "...");
select.onchange = function() {
onStatusChanged(select, callid, anotherid);
};
td.appendChild(select);
}
Run Code Online (Sandbox Code Playgroud)
但是当onchange为一个<select>元素触发事件时,似乎将相同的值传递给表中每个表的onStatusChanged()方法<select>(我已经在循环的每次迭代中验证了,callid并且anotherid被赋予了新的,不同的值).
我怀疑这是因为我使用select.onchange = function()语法设置事件处理程序的性质.如果我理解这是如何正常工作的,那么这个语法将onchange事件的闭包设置为一个函数,该函数引用这两个引用,最终得到它们在循环的最后一次迭代中设置的最终值.触发事件时,由callid和引用anotherid的值是最后一次迭代中设置的值,而不是在单个迭代中设置的值.
有没有办法可以复制我传递给的参数的值onStatusChanged()?
我更改了标题以更好地反映问题和接受的答案.
看到:
for (var i in this.items) {
var item = this.items[i];
$("#showcasenav").append("<li id=\"showcasebutton_"+item.id+"\"><img src=\"/images/showcase/icon-"+item.id+".png\" /></li>");
$("#showcasebutton_"+item.id).click(function() {
alert(item.id);
self.switchto(item.id);
});
}
Run Code Online (Sandbox Code Playgroud)
问题是警报的item.id始终是数组中最后一项的id(this.items).怎么解决?
我手边有一个问题,我没有得到使用哪种设计模式.问题是这样的:
我必须构建一个具有'N'状态的系统,并且我的系统必须根据某些条件从任何状态转换到任何其他状态.例如:在条件1下,从状态1移动到3,在条件2上从状态1移动到4.
甚至从一个状态到另一个状态的转换也可以在两个或更多个不同的条件下完成.
例如,从状态1到状态3的转换可以在以下
情况下完成:条件1:"它是星期日"
条件2:"它的下雨"
条件3:"它的下雨和星期日"
在每种情况下,状态3的处理可以是不同.
我希望我能够清楚地理解这个问题.请帮助.
非常感谢
我如何设计一个API来隐藏AJAX和HTTP请求的异步性质,或者基本上将其延迟以提供流畅的界面.要在Twitter的新Anywhere API中显示示例:
// get @ded's first 20 statuses, filter only the tweets that
// mention photography, and render each into an HTML element
T.User.find('ded').timeline().first(20).filter(filterer).each(function(status) {
$('div#tweets').append('<p>' + status.text + '</p>');
});
function filterer(status) {
return status.text.match(/photography/);
}
Run Code Online (Sandbox Code Playgroud)
vs this(每个调用的异步性质清晰可见)
T.User.find('ded', function(user) {
user.timeline(function(statuses) {
statuses.first(20).filter(filterer).each(function(status) {
$('div#tweets').append('<p>' + status.text + '</p>');
});
});
});
function filterer(status) {
return status.text.match(/photography/);
}
Run Code Online (Sandbox Code Playgroud)
它找到用户,获取他们的推文时间轴,仅过滤前20条推文,应用自定义过滤器,并最终使用回调函数来处理每条推文.
我猜这样设计良好的API应该像查询构建器(想想ORM)一样工作,每个函数调用构建查询(在这种情况下为HTTP URL),直到它遇到循环函数,如每个/ map /等.进行HTTP调用,传入函数成为回调函数.
一个简单的开发途径是使每个AJAX调用同步,但这可能不是最好的解决方案.我有兴趣找出使其异步的方法,并仍然隐藏AJAX的异步性质.
javascript ×7
closures ×3
loops ×3
arrays ×2
jquery ×2
ruby ×2
ajax ×1
associations ×1
asynchronous ×1
automata ×1
callstack ×1
dom ×1
exception ×1
java ×1
rails-models ×1
range ×1
stack-trace ×1