相关疑难解决方法(0)

1126
推荐指数
17
解决办法
84万
查看次数

JavaScript保证是单线程的吗?

众所周知,JavaScript在所有现代浏览器实现中都是单线程的,但是它是在任何标准中指定的还是仅仅是传统的?假设JavaScript始终是单线程的,这是完全安全的吗?

javascript concurrency

588
推荐指数
8
解决办法
12万
查看次数

如何知道函数是否异步?

我必须将一个函数传递给另一个函数,并将其作为回调执行.问题是有时这个函数是异步的,比如:

async function() {
 // Some async actions
}
Run Code Online (Sandbox Code Playgroud)

所以我想执行await callback()callback()取决于它接收的函数类型.

有没有办法知道函数的类型?

javascript node.js async-await ecmascript-next

58
推荐指数
6
解决办法
1万
查看次数

React setState不更新状态

所以我有这个:

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呢?我甚至提出了超时延迟,看看是否解决了这个问题.任何明显的或我应该发布更多的代码?

javascript state setstate reactjs

54
推荐指数
10
解决办法
7万
查看次数

异步Javascript执行是如何发生的?什么时候不使用return语句?

// 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语句?

有人可以对此有所了解吗?

javascript asynchronous return function execution

37
推荐指数
2
解决办法
2万
查看次数

CSS转换在jQuery .load回调失败

我有一个函数,使用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');似乎什么都不做的行会导致过渡效果起作用.这是一个演示:

http://so-37035335-b.dev.zuma-design.com/ …

html javascript css jquery css3

12
推荐指数
2
解决办法
916
查看次数

如何在重定向用户之前等待跟踪脚本被触发?

我运行一个典型的价格比较网站,用户浏览产品,然后点击链接转到商家的网站.

在被重定向到商家的网站之前,用户会看到"我们正在重定向您......"页面.

此页面仅允许跟踪代码(Google Analytics,Adwords,Bing Ads ...)来跟踪活动.

我已将跟踪代码放在结束</body>标记之前,以避免在加载脚本时阻止页面的呈现.

我正在使用元刷新标记重定向用户:

<meta http-equiv="refresh" content="0; url=...">
Run Code Online (Sandbox Code Playgroud)

似乎工作正常,但我担心,根据互联网连接的浏览器/速度,重定向可能发生在跟踪脚本被触发之前.

我可以将重定向延迟几秒钟以保证安全,但我希望为用户保持顺畅的体验.

我也可以在脚本中包含脚本<head>,但是:

  • 这会在加载脚本时延迟"重定向..."页面上的显示
  • 不能保证跟踪脚本在重定向用户之前已完成其工作:首先加载跟踪脚本,然后异步触发另一个操作以跟踪事件.

如何保证跟踪脚本已完成其工作,同时仍尽快重定向用户?

任何有关类似经历的反馈都将受到赞赏.

html javascript

10
推荐指数
1
解决办法
3833
查看次数

javascript中的异步操作

我听说有人在谈论javascript中的异步操作.另一方面,人们说Javascript总是同步同步javascript.这是真的吗?Javascript真的是异步还是同步?当人们谈论异步javascript时,人们的意思是什么?

我所理解的是,同一页面上的Javascript无法与另一个javascript代码块同时运行.但是例如在ajax请求中,在等待服务器响应时,可以执行代码,然后当响应到达时,继续回调.虽然这是否意味着,在我们等待服务器响应时运行的代码将不得不完成自己,否则它将被中断?

javascript asynchronous

7
推荐指数
3
解决办法
3279
查看次数

Array.forEach是异步的吗?

根据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)

javascript

2
推荐指数
1
解决办法
3104
查看次数

Javascript执行问题

如果我有一个运行多个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

1
推荐指数
1
解决办法
98
查看次数