Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
并行运行两个javascript函数 (函数(){ 函数main(){ call1(); call2(); } 函数call1(){ 返回新承诺(()=>{ for(设i=0;i{ 对于(让i=0;i_Javascript_Promise - Fatal编程技术网

并行运行两个javascript函数 (函数(){ 函数main(){ call1(); call2(); } 函数call1(){ 返回新承诺(()=>{ for(设i=0;i{ 对于(让i=0;i

并行运行两个javascript函数 (函数(){ 函数main(){ call1(); call2(); } 函数call1(){ 返回新承诺(()=>{ for(设i=0;i{ 对于(让i=0;i,javascript,promise,Javascript,Promise,查看Promise.all) 这将要求你的所有承诺和决心,当它们完成(解决或拒绝) 另一个选项是Promise.race,具体取决于您的用例 这将返回完成的第一个承诺(解析或拒绝)实际上,您的两个承诺在同一线程中运行 所以你可能想要 Web Workers是Web内容运行脚本的一种简单方法 后台线程。工作线程可以执行任务,而无需 干扰用户界面。此外,他们可以执行I/O 使用XMLHttpRequest(尽管响应XML和通道属性 (始终为空) 如下图所示: 让url1=window.URL.cr

查看
Promise.all

这将要求你的所有承诺和决心,当它们完成(解决或拒绝)

另一个选项是
Promise.race
,具体取决于您的用例


这将返回完成的第一个承诺(解析或拒绝)

实际上,您的两个承诺在同一线程中运行

所以你可能想要

Web Workers是Web内容运行脚本的一种简单方法 后台线程。工作线程可以执行任务,而无需 干扰用户界面。此外,他们可以执行I/O 使用XMLHttpRequest(尽管响应XML和通道属性 (始终为空)

如下图所示:

让url1=window.URL.createObjectURL(
新Blob([document.querySelector('#worker1').textContent])
)
let worker1=新工作者(url1)
设url2=window.URL.createObjectURL(
新Blob([document.querySelector('#worker2').textContent])
)
let worker2=新工作者(url2)
worker1.onmessage=(msg)=>{
console.log(msg.data)
}
worker2.onmessage=(msg)=>{
console.log(msg.data)
}
worker1.postMessage('init');
worker2.postMessage('init');

addEventListener('message',函数(){

对于(设i=0;i我相信您希望像这样运行主函数:

(function() {

  function main() {
    call1();
    call2();
  }

  function call1() {
    return new Promise(() => {
      for (let i=0; i<100; i++) {
        console.log('This is call-1:', i);
      }
    });
  }

  function call2() {
    return new Promise(() => {
      for (let i=0; i<100; i++) {
        console.log('This is call-2:', i);
      }
    });
  }

  main();

})();
Promise.all
是一种如何运行2个或更多异步调用并等待所有调用完成的方法。如注释中所述,它们并不像您所想的那样并行运行


还要确保您的
call1()
call2()
函数将在某个时候调用
resolve
reject
函数。通过调用这些函数,您可以让程序知道它是完成的还是“出错的”。更多信息
(或者更确切地说,您传递给它的函数)是同步且立即执行的

以下代码:

function main() {
  Promise.all([call1(), call2()])
    .then( (data) => {
      // this block will run, if and when BOTH calls/promises resolve
      // process the data from calls
    })
    .catch( (err) => { // process the err });
}
始终按该顺序输出1 2 3

您传递给两个Promise构造函数的两个函数都是完全同步的。没有异步操作(如setTimeout或通过回调读取文件),因此它是一个接一个地执行的

与其他一些答案可能告诉您的不同,
Promise.all()
在这种情况下不会保存您。事件循环、滴答声或您可能听说过的任何其他术语不会生效。您的代码是完全同步的


大多数JavaScript运行时(浏览器、Node.js等)都是单线程的,因为JavaScript代码在一个线程中运行(浏览器使用多个线程,但js代码在一个线程中运行)


因此,在这种特殊情况下,您无能为力(除了使用Worker或其他线程选项,您可能不想进入)。你不能神奇地使同步代码异步,即使是耍花招。

承诺不会使任何东西并行运行,也不会引入多线程或其他功能。它们只是帮助你等待已经具有异步性质的东西,而你的示例代码没有异步性,而你的真实代码(使用ajax)会的。请给我们看ajax代码。Javascript是单线程的。一次只能在主线程中运行其中一个循环。不完全清楚您在寻找什么我不确定,但这可能会有所帮助-@Bergi我认为OP使用“parallel”作为形容词(异步库也是如此)而不是指线程的并行执行。从这个意义上说,是的,承诺允许事情并行发生。“这只是一个模拟我真实代码的示例,其中我有两个函数,每个函数中都有ajax调用。”也许…用一个类似异步的例子,比如设置超时?很明显,这不是OPs对这个问题的意图。不过,还是一如既往地感谢民间的讨论。
console.log(1);
new Promise(resolve => resolve(console.log(2));
console.log(3);