相关疑难解决方法(0)

在Javascript中sleep()

假设我想在一定时间内阻止Javascript执行出于某种奇怪的原因,我该怎么做呢.JS中没有sleep().请不要说做while()循环,因为那很糟糕.我可以做一个window.showModalDialog并在一个非常小的时间的setTimeout的模态对话框中放置一个window.close,这样用户就不会注意到该对话框.这就像睡眠一段时间,如果需要我可以多次调用.还有其他方法吗?

详细说明,我的用例是HTML5 SQL数据库已经给出了异步api,但我想将它用于一个小商店永远不会大的小型webapp.因此不需要异步api,因为小商店上的查询将在客户端运行.所以我想编写一个带有sync api的ORM,以便开发人员可以更轻松地使用它.要将此异步桥接到同步api,我需要像睡眠这样的东西.

javascript html5 modal-dialog blocking

14
推荐指数
3
解决办法
3万
查看次数

如何在单击后以编程方式将异步依赖内容复制到剪贴板?

我正在尝试以编程方式使用Chrome(Build 43)中的execCommand将异步JSONP请求的结果复制到剪贴板.这是一个逻辑片段:

loadContent()

function loadContent(callback) {
  $.getJSON('http://www.randomtext.me/api/lorem/p-5/10-20?&callback=myFunc',function(result){
    console.log('result=',result.text_out);
    $("#container").html(result.text_out);
    if (callback) {
      callback();
    }
  });
}

function copyAjax() {

 loadContent(copy);

}

function copy() {
  var copyDivText = $('#container').text();
  console.log('copyDivText=',copyDivText);
  executeCopy(copyDivText);
}

document.addEventListener("DOMContentLoaded", function(){
      document.getElementById("copy").onclick = copy;
    });


document.addEventListener("DOMContentLoaded", function(){
      document.getElementById("copyAjax").onclick = copyAjax;
    });


// Copy text as text
function executeCopy(text) {
    var input = document.createElement('textarea');
    document.body.appendChild(input);
    input.value = text;
    input.focus();
    input.select();
    document.execCommand('Copy');
    input.remove();
}
Run Code Online (Sandbox Code Playgroud)

我知道你开始编译的43代Chrome使用execCommand和剪贴板.但问题是,您需要在执行用户发起的事件(其中权限被提升)中执行此操作.这是ZeroClipboard基于闪存的解决方案所具有的类似限制.除了得到一个不可能的答案(这是我现在正在思考的问题)之外,这些是我想做的其他选择(警告,它们都是Hail Mary Passes):

  1. 由于JSONP不能同步,因此将其转换为使用常规AJAX调用的内容,并确保AJAX调用在用户事件的执行上下文中是同步的.这违背了我根深蒂固的信念,即我们不应该进行同步XHR调用,因为它会降低用户体验.
  2. 当用户使用鼠标接近复制按钮时,我们会抢先发送服务器请求,并希望在用户单击按钮之前足够快.这是一个明显的竞争条件,可能不是时间的一部分,并且当用户想要执行Ctrl/Command-C而不是单击复制按钮时将无法确定.
  3. 执行两个步骤.单击以触发呼叫,当内容可用时,显示内容可用的消息,然后再次单击消息区域以复制到剪贴板.它似乎不是最好的UX互动.我用这个替代方法创建了这个例子.以编程方式触发单击不构成用户问题事件.
  4. 可能有一种方法可以创建简单的Chrome扩展程序,并允许用户将该扩展程序的权限设置为复制到剪贴板.这涉及但最终用户必须安装和扩展并更改本地浏览器设置.不确定很多用户是否有能力/愿意这样做.

我已经看过成问题,#2,如 …

javascript ajax clipboard zeroclipboard

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

具有复合赋值的JavaScript中的竞争条件

我不是在谈论涉及网络事件的复杂竞争条件.相反,我似乎发现+=运营商在V8(Chrome 58或Node 8)中不是原子的.

下面的代码旨在并行运行两个所谓的线程.每个"线程"重复调用一个函数,该函数在睡眠很多秒后返回其数字参数.结果总结为累加器.

function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

// Return the passed number after sleeping that many seconds
async function n(c) {
  await sleep(c * 1000);
  console.log('End', c);
  return c;
}

let acc = 0;  // global

// Call n repeatedly and sum up results
async function nForever(c) {
  while (1) {
    console.log('Calling', c);
    acc += await n(c);  // += not atomic?!
    console.log('Acc', acc); …
Run Code Online (Sandbox Code Playgroud)

javascript multithreading asynchronous node.js async-await

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

Jest反应测试:延迟后检查状态

我真的很困惑试图用玩笑的文档的帮助下创建测试https://facebook.github.io/jest/docs/timer-mocks.html#content

我正在尝试检查容器安装时的状态,然后几秒后,我在状态下手动设置值(使用setTimeout()).

我在Main的componentDidMount中有一个函数,如下所示:

componentDidMount() {
    this.setStateAfterDelay();
}
Run Code Online (Sandbox Code Playgroud)

该功能的作用是:

setStateAfterDelay = () => {
    setTimeout(() => {
        this.setState({ fruits: ['banana', 'apple', 'orange', 'vodka', 'kiwi'] });
    }, 1500);
}
Run Code Online (Sandbox Code Playgroud)

我完成了第一部分:

const component = mount(<Main />);
expect(component.state().fruits).toEqual(null);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何再次检查状态,让我说2000ms?

任何帮助表示赞赏:)

javascript unit-testing reactjs jestjs

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

JavaScript睡眠

是的,我知道 - 这个问题有成千上万的答案.请不要告诉我setTimeout方法,因为 - 是的,一切皆有可能,但不如使用sleep()方法那么容易.

例如:

function fibonacci(n) {
    console.log("Computing Fibonacci for " + n + "...");
    var result = 0;

    //wait 1 second before computing for lower n
    sleep(1000);
    result = (n <= 1) ? 1 : (fibonacci(n - 1) + fibonacci(n - 2));

    //wait 1 second before announcing the result
    sleep(1000);
    console.log("F(" + n + ") = " + result);

    return result;
}
Run Code Online (Sandbox Code Playgroud)

如果你知道如何使用相同的结果setTimeout- 告诉我;)fibanacci是非常容易的任务,因为不超过2次递归,但是如何进行n次递归(如fib(1)+ fib(2)+). .+ fib(n))并在每个"+"之后睡觉?不,睡觉会轻松多了.

但我仍然无法实现它的实例.while (curr - …

javascript sleep

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

延迟函数的返回

无论如何都要延迟函数的返回,使用setTimeout().

function foo(){
  window.setTimeout(function(){
      //do something
  }, 500);
 //return "some thing but wait till SetTimeout() finished";
}
Run Code Online (Sandbox Code Playgroud)

javascript delay settimeout

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

如何在"后台"中运行javascript函数/不冻结UI

我做了一个HTML表单,在很多不同的选项卡中有很多问题(来自数据库).然后用户在这些问题中给出答案.每次用户更改选项卡时,我的Javascript都会创建一个保存.问题是每次更改选项卡时我都必须遍历所有问题,并且每次冻结表单大约5秒钟.

我一直在寻找答案如何在后台运行我的保存功能.显然没有真正的方法在后台运行某些东西,很多人建议使用setTimeout();例如这一个如何让一组js函数在后台运行

但是这些例子都没有解释或考虑到即使我使用类似的东西setTimeout(saveFunction, 2000);也无法解决我的问题.在这种情况下,它只将它推迟2秒.

有没有办法解决这个问题?

javascript

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

使函数调用for循环同步

我在请求中得到了一个字符串数组.每个字符串都包含要在本机shell上执行的命令.

var process = require('child_process'); 

function execCommand(req,res,callback){
 var params = req.params.list              //list is an array in the   request
 var result = '';
 var command = '';  
 for (var i = 0; i < params.length; i++) {
  command = params[i];
  cmd = process.exec(command);                        
  cmd.stdout.on('data', function(data){                       
   //push the shell output in variable result
  });
  cmd.on('close', function(code) {                            
   //convert the variable result to a valid JSON
  });
 }
 res.send(result);
};
Run Code Online (Sandbox Code Playgroud)

所有命令的结果在result变量中混淆.如何使for循环中的函数调用同步?

javascript node.js

8
推荐指数
2
解决办法
7863
查看次数

如何捕获FileReader base64作为变量?

这将base64输出到控制台:

function getBase64(file) {
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function() {
        console.log(reader.result);
    };
    reader.onerror = function(error) {
        console.log('Error: ', error);
    };
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file); // prints the base64 string
Run Code Online (Sandbox Code Playgroud)

资料来源: https ://stackoverflow.com/a/36281449/1063287

jsFiddle: 上面工作代码的jsFiddle演示

我希望能够将base64分配给变量,所以我根据这个答案尝试了以下内容:

function getBase64(file, onLoadCallback) {
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = onLoadCallback;
    reader.onerror = function(error) {
        console.log('Error when converting PDF file to base64: ', error);
    };
}

var my_pdf_file = document.querySelector("#my_pdf_file").files[0];
var my_pdf_file_as_base64 …
Run Code Online (Sandbox Code Playgroud)

javascript base64 filereader

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

强制〜同步Node.js IPC

我有一个fork()使用IPC 创建子进程的节点服务器。在某个时候,孩子会以大约10Hz的频率将结果发送回父母,这是一项长期任务的一部分。当传递给您的有效负载process.send()很小时,它们都可以正常工作:我发送的每条消息都会立即收到并由父级处理。

但是,当有效载荷为“大”时(我尚未确定确切的大小限制),而不是立即由父级接收所有有效载荷,而是仅在子级完成其长时间运行的任务后,父级才会接收父级并处理消息。

tl; dr视觉:

良好(发生有效负载较小的情况):

child:  send()
parent: receive()
child:  send()
parent: receive()
child:  send()
parent: receive()
...
Run Code Online (Sandbox Code Playgroud)

错误(发生有效负载的情况):

child:  send()
child:  send()
child:  send()
(repeat many times over many seconds)
...
parent: receive()
parent: receive()
parent: receive()
parent: receive()
...
Run Code Online (Sandbox Code Playgroud)
  1. 这是错误吗?(编辑:行为仅在OS X上发生,而不在Windows或Linux上发生)
  2. 除了设法使我的IPC有效负载保持较小之外,还有什么方法可以避免这种情况?

编辑2:下面的示例代码同时使用时间和迭代计数器来选择何时发送更新。(在我的实际代码中,也可以在n次迭代之后或在循环达到某些结果之后发送更新。)这样,使用setInterval/ setTimeout而不是循环来重写代码对我来说是不得已的选择,因为这需要我删除功能。

编辑:这是重现该问题的测试代码。但是,它只能在OS X上复制,而不能在Windows或Linux上复制:

server.js

child:  send()
parent: receive()
child:  send()
parent: receive()
child:  send()
parent: receive()
...
Run Code Online (Sandbox Code Playgroud)

worker.js

child:  send()
child: …
Run Code Online (Sandbox Code Playgroud)

javascript ipc node.js

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