众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的还是仅仅是传统的?假设JavaScript始终是单线程的,这是完全安全的吗?
我必须将一个函数传递给另一个函数,并将其作为回调执行.问题是有时这个函数是异步的,比如:
async function() {
// Some async actions
}
Run Code Online (Sandbox Code Playgroud)
所以我想执行await callback()或callback()取决于它接收的函数类型.
有没有办法知道函数的类型?
所以我有这个:
let total = newDealersDeckTotal.reduce(function(a, b) {
return a + b;
},
0);
console.log(total, 'tittal'); //outputs correct total
setTimeout(() => {
this.setState({dealersOverallTotal: total});
}, 10);
console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total
Run Code Online (Sandbox Code Playgroud)
newDealersDeckTotal只是一个数字数组,[1, 5, 9]但是this.state.dealersOverallTotal不能给出正确的总数但是total呢?我甚至提出了超时延迟,看看是否解决了这个问题.任何明显的或我应该发布更多的代码?
// synchronous Javascript
var result = db.get('select * from table1');
console.log('I am syncronous');
// asynchronous Javascript
db.get('select * from table1', function(result){
// do something with the result
});
console.log('I am asynchronous')
Run Code Online (Sandbox Code Playgroud)
我知道在同步代码中,console.log()在从db获取结果后执行,而在异步代码中,console.log()在db.get()获取结果之前执行.
现在我的问题是,异步代码的幕后执行是如何发生的,为什么它是非阻塞的?
我已经搜索了Ecmascript 5标准,以了解异步代码如何工作,但在整个标准中找不到异步这个词.
从nodebeginner.org我也发现我们不应该使用return语句,因为它阻止了事件循环.但是nodejs api和第三方模块在任何地方都包含return语句.那么什么时候应该使用return语句,何时不应该使用return语句?
有人可以对此有所了解吗?
我有一个函数,使用jQuery将html加载到一个表中,然后使用回调向其中一行添加一个类.该功能由页面上的各种UI驱动事件触发.我也有一个css转换规则,所以颜色应淡入(transition: background-color 1000ms linear).该函数如下所示:
function load_tbody(row_id) {
$('tbody').load("load_tbody.php", function() {
$(row_id).addClass('green');
});
}
Run Code Online (Sandbox Code Playgroud)
加载html后,成功添加类并将行颜色设置为绿色.但是,我的css转换规则似乎被忽略了.
当我添加一点延迟,甚至10毫秒时,它工作正常:
function load_tbody(row_id) {
$('tbody').load("load_tbody.php", function() {
setTimeout(function() {
$(row_id).addClass('green');
}, 10);
});
}
Run Code Online (Sandbox Code Playgroud)
状态的jQuery文档.load():
如果提供"完整"回调,则在后处理和执行HTML插入之后执行.
对我而言,这将表明新元素已加载到dom中,并且已应用现有样式并且可以进行操作.为什么转换在第一个示例中失败但在第二个示例中成功?
这是一个功能齐全的示例页面,用于演示相关行为:
http://so-37035335.dev.zuma-design.com/
虽然上面的例子从cdn链接了jQuery 2.2.3版,但实际的页面使用的是版本1.7.1.两个版本都可以观察到相同的行为.
更新:
在考虑了下面提供的一些评论和答案之后,我偶然发现了一些令人困惑的事情.用户@gdyrrahitis提出了一个建议,引导我这样做:
function tbody_fade(row_id) {
$('tbody').load("load_tbody.php", function() {
$('tbody').fadeIn(0, function() {
$(this).find(row_id).addClass('green');
});
});
}
Run Code Online (Sandbox Code Playgroud)
在fadeIn()回调中添加类可以工作,即使持续时间为0ms.因此,这让我想知道......如果元素是理论上反正有什么背景颜色做浏览器认为它之前,我补充一点类.所以我记录了background-color:
console.log($(row_id).css('background-color'));
Run Code Online (Sandbox Code Playgroud)
你知道吗?只需获得背景色的颜色就可以了:
function tbody_get_style(row_id) {
$('tbody').load("load_tbody.php", function() {
$(row_id).css('background-color');
$(row_id).addClass('green');
});
}
Run Code Online (Sandbox Code Playgroud)
只是添加$(row_id).css('background-color');似乎什么都不做的行会导致过渡效果起作用.这是一个演示:
我运行一个典型的价格比较网站,用户浏览产品,然后点击链接转到商家的网站.
在被重定向到商家的网站之前,用户会看到"我们正在重定向您......"页面.
此页面仅允许跟踪代码(Google Analytics,Adwords,Bing Ads ...)来跟踪活动.
我已将跟踪代码放在结束</body>标记之前,以避免在加载脚本时阻止页面的呈现.
我正在使用元刷新标记重定向用户:
<meta http-equiv="refresh" content="0; url=...">
Run Code Online (Sandbox Code Playgroud)
它似乎工作正常,但我担心,根据互联网连接的浏览器/速度,重定向可能发生在跟踪脚本被触发之前.
我可以将重定向延迟几秒钟以保证安全,但我希望为用户保持顺畅的体验.
我也可以在脚本中包含脚本<head>,但是:
如何保证跟踪脚本已完成其工作,同时仍尽快重定向用户?
任何有关类似经历的反馈都将受到赞赏.
我听说有人在谈论javascript中的异步操作.另一方面,人们说Javascript总是同步同步javascript.这是真的吗?Javascript真的是异步还是同步?当人们谈论异步javascript时,人们的意思是什么?
我所理解的是,同一页面上的Javascript无法与另一个javascript代码块同时运行.但是例如在ajax请求中,在等待服务器响应时,可以执行代码,然后当响应到达时,继续回调.虽然这是否意味着,在我们等待服务器响应时运行的代码将不得不完成自己,否则它将被中断?
根据JavaScript,Node.js:Array.forEach是异步的吗?,Array.forEach是同步的。但是,对于下面的代码:
function wait5() {
return new Promise(resolve =>
setTimeout(resolve, 5000));
}
async function main() {
console.log("Start");
[1,2].forEach(async (e) => {
const d = await wait5().then(()=> console.log("5s later") )
})
console.log("This should come last!");
}
main();
Run Code Online (Sandbox Code Playgroud)
输出为:
Start
This should come last!
5s later
5s later
Run Code Online (Sandbox Code Playgroud)
两个“ 5s之后”迅速相继问世。
为什么会这样呢?
如果我使用普通for循环:
async function main() {
console.log("Start");
for (let i=0;i<2;i++) {
const d = await wait5().then(()=> console.log("5s later") )
}
console.log("This should come last!");
}
Run Code Online (Sandbox Code Playgroud)
那么结果就是我想要的:
Start
5s later …Run Code Online (Sandbox Code Playgroud) 如果我有一个运行多个javascripts的事件,下面的脚本会等到上一个脚本运行之前完成吗?
例:
<a href="#" onclick="javascript:SCRIPT_1();SCRIPT_2();SCRIPT_3();">Test Me</a>
Run Code Online (Sandbox Code Playgroud)
将SCRIPT_2不执行,直到SCRIPT_1完成做它的东西吗?
谢谢.
javascript ×9
asynchronous ×3
execution ×2
html ×2
async-await ×1
concurrency ×1
css ×1
css3 ×1
function ×1
jquery ×1
node.js ×1
reactjs ×1
return ×1
setstate ×1
state ×1
synchronous ×1