事件处理程序是在JavaScript中同步还是异步执行的?这是JS bin,它显示了事件处理程序是同步执行的.
码:
$('#toclick').bind('custom', function() {
for (var i=0; i<100000; i++) {}
console.log('Inside click handler');
});
$('#toclick').trigger('custom');
console.log('Outside click handler');
Output:
Inside click handler
Outside click handler
Run Code Online (Sandbox Code Playgroud)
这意味着如果我们触发事件,除非执行所有事件处理程序,否则不会执行它下面的代码.我对吗 ?
我需要一种方法使流星调用同步,以便在运行调用时代码等待结果完成,以便它可以继续到客户端上的下一行代码.
例如:
clientFunction = function(){
Meteor.call('serverFunction', function(err,result){})//<--so when this gets a result and
//is stored in a session variable
var doSomeThing = Session.get('whatever') <-- so that your able to use it here
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试做一个while循环来防止任何事情发生,直到返回一个值,但似乎它在clientFunction之后运行,从而将其抛给它的死亡
任何帮助都会被贬低
我想为每个循环做一个但是让它同步运行.循环的每次迭代都将执行一次http.get调用,并返回json,以便将值插入数据库.问题是for循环以异步方式运行,导致所有http.gets都立即运行,我的数据库最终没有插入所有数据.我正在使用async-foreach尝试做我想做的事情它可以做,但如果我能以正确的方式做到这一点,我就不必使用它.
mCardImport = require('m_cardImport.js');
var http = require('http');
app.get('/path/hi', function(req, res) {
mCardImport.getList(function(sets) {
forEach(sets, function(item, index, arr) {
theUrl = 'http://' + sets.set_code + '.json';
http.get(theUrl, function(res) {
var jsonData = '';
res.on('data', function(chunk) {
jsonData += chunk;
});
res.on('end', function() {
var theResponse = JSON.parse(jsonData);
mCardImport.importResponse(theResponse.list, theResponse.code, function(theSet) {
console.log("SET: " + theSet);
});
});
});
});
});
});
Run Code Online (Sandbox Code Playgroud)
和我的模特
exports.importResponse = function(cardList, setCode, callback) {
mysqlLib.getConnection(function(err, connection) {
forEach(cardList, function(item, index, arr) {
var theSql = "INSERT …
Run Code Online (Sandbox Code Playgroud) 同步XMLHttpRequest已被弃用,这意味着最终将删除对它的支持,这是我在Chrome中收到的消息:
主线程上的同步XMLHttpRequest因其对最终用户体验的不利影响而被弃用.如需更多帮助,请访问http://xhr.spec.whatwg.org/.
所以,我的问题是,如果是,如果是的话,主流浏览器(特别是Chrome)何时会放弃对同步XMLHttpRequest的支持?
我有一个页面(page 1
)接受发布请求,做一些事情并在最后显示一些数据.
从另一个页面(page 2
),我想重定向到page 1
单击按钮时,当然发送page 1
通过POST 所需的所有相关数据.
当然,我可以使用在页面上有一个不可见形式的旧hack,在用户点击按钮之后填入我需要的所有数据,然后自动提交().但这看起来很麻烦 - 使用类似的语法更好$.post
,而不是开始操纵html.$.post
它是完美的,它实际上是重定向到页面而不是异步地发出请求(我不能只是page 1
在ajaxy帖子完成后重定向到page 1
需要数据显示的东西).
有没有办法用jquery做我想要的东西,或者丑陋的隐形形式是唯一的出路?
PS
我知道还有其他复杂的方法可以实现我想要的东西,例如$.post
在我们当前使用的页面中使用和只是种植响应的html,但我只是想知道是否有一种直接的方式来实现这一点与jquery
我正在编写一个C#.Net 4.5库,用于执行常见的SQL数据库操作(备份,恢复,执行脚本等).我希望每个操作都有同步和异步函数,因为这个库将由控制台和GUI应用程序使用,但我不想在任何地方重复代码.所以我看到它,我有两个选择:
编写在同步函数中执行工作的代码,然后将其包装在async函数的任务中,如下所示:
public void BackupDB(string server, string db)
{
// Do all of the work and long running operation here
}
public async Task BackupDBAsync(string server, string db)
{
await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)编写在异步函数中执行工作的代码,并使用.Wait()从同步函数中调用它:
public async Task BackupDBAsync(string server, string db)
{
// Do all of the work and long running operation here, asynchronously.
}
public void BackupDB(string server, string db)
{
BackupDBAsync(server, db).Wait(); // Execution will wait here until async function finishes completely.
}
Run Code Online (Sandbox Code Playgroud)一种选择比另一种更好吗?这是一个最佳实践吗?或者还有其他(更好的)替代方案吗?
我知道使用.Wait()的一个警告是async函数中的所有await语句都必须使用.ConfigureAwait(false)来避免死锁( …
阅读JMS的一些文件后,我完全被这句话不解synchronous
和asynchronouns
.
见此页:http://docs.oracle.com/cd/E19798-01/821-1841/bncdq/index.html
同步
您使用receive方法同步使用消息.您可以在调用start方法后随时使用此方法:
Run Code Online (Sandbox Code Playgroud)connection.start(); Message m = consumer.receive(); connection.start(); Message m = consumer.receive(1000); // time out after a second
要异步使用消息,请使用消息侦听器,如下一节所述.
异步
JMS消息侦听器消息侦听器是一个对象,充当消息的异步事件处理程序.此对象实现MessageListener接口,该接口包含一个onMessage方法.在onMessage方法中,您可以定义消息到达时要执行的操作.
使用setMessageListener方法向特定的MessageConsumer注册消息侦听器.例如,如果定义一个名为Listener的类来实现MessageListener接口,则可以按如下方式注册消息监听器:
Run Code Online (Sandbox Code Playgroud)Listener myListener = new Listener(); consumer.setMessageListener(myListener);
我有两个问题:
据我所知,JMS的本质是异步的.生产者将消息发布到队列/主题,它不需要等待消费者.这是异步行为.怎么会"同步"?
如果"mesageListener"是异步的,但在我使用spring-jms的测试中,我发现它总是在一个线程中运行.这意味着,如果我写Thread.sleep(2000)
在onMessage
,它具有处理下一条消息之前是等待2秒.它是"异步"吗?
我有以下HTML代码:
<input type='file' multiple>
Run Code Online (Sandbox Code Playgroud)
这是我的JS代码:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
var fr = new FileReader();
for(var i = 0; i < inputFiles.files.length; i++){
fr.onload = function(){
console.log(i) // Prints "0, 3, 2, 1" in case of 4 chosen files
}
}
fr.readAsDataURL(inputFiles.files[i]);
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,如何使这个循环同步?首先等待文件完成加载然后转到下一个文件.有人告诉我使用__CODE__
.但我不能让它发挥作用.这是我正在尝试的:
var inputFiles = document.getElementsByTagName("input")[0];
inputFiles.onchange = function(){
for(var i = 0; i < inputFiles.files.length; i++){
var fr = new FileReader();
var test = new Promise(function(resolve, reject){
console.log(i) // Prints 0, …
Run Code Online (Sandbox Code Playgroud) 我们有一种情况,我们需要在执行XHR/Ajax请求后在浏览器中打开一个新选项卡.
我们通过将Ajax请求设置为同步执行以保持受信任的click事件的上下文来实现此目的,这样可以正常工作.
但是,在最新的Chrome版本(36)中,当Ajax调用有一些延迟时,我们会遇到弹出警告... 2秒的延迟足以让Chrome显示弹出警告,而不是像预期的那样打开标签.代码本身正常工作,我可以多次单击该按钮,它一直有效,直到请求遇到一些延迟.然后我得到弹出警告......
是否存在应用于同步Ajax请求的超时,在此期间需要完成它以使可信事件仍然可用?
有没有办法规避这个?毕竟,呼叫已经同步并冻结其他所有内容,直到结果到来.
谢谢.
更新:我已经创建了一个JSFiddle来演示这个问题:http://jsfiddle.net/23JNw/9/
/**
* This method will give open the popup without a warning.
*/
function performSlowSyncronousRequest() {
$.ajax({
url: '/echo/html',
data: {delay: 2}, //JSfiddle will delay the answer by 2 seconds
success: function(){
window.open('http://www.thirtykingdoms.com'); //this causes the popup warning in Chrome
},
async: false
});
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Promise和Express.
router.post('/Registration', function(req, res) {
var Promise = require('promise');
var errorsArr = [];
function username() {
console.log("1");
return new Promise(function(resolve, reject) {
User.findOne({ username: req.body.username }, function(err, user) {
if(err) {
reject(err)
} else {
console.log("2");
errorsArr.push({ msg: "Username already been taken." });
resolve(errorsArr);
}
});
});
}
var username = username();
console.log(errorsArr);
});
Run Code Online (Sandbox Code Playgroud)
当我记录时errorsArray
,它是空的,我不知道为什么.我是node.js的新手.提前致谢.
synchronous ×10
javascript ×4
asynchronous ×3
jquery ×2
node.js ×2
promise ×2
.net-4.5 ×1
ajax ×1
async-await ×1
browser ×1
c# ×1
call ×1
deprecated ×1
express ×1
filereader ×1
java ×1
jms ×1
meteor ×1
methods ×1
mongoose ×1
mysql ×1
popup ×1
post ×1