Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.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 Promise.all fun函数同时运行_Javascript_Parallel Processing_Ecmascript 6_Es6 Promise - Fatal编程技术网

如何让Javascript Promise.all fun函数同时运行

如何让Javascript Promise.all fun函数同时运行,javascript,parallel-processing,ecmascript-6,es6-promise,Javascript,Parallel Processing,Ecmascript 6,Es6 Promise,据我从文档中了解,可以同时运行两个或多个函数,并等待所有函数完成。所以我试了一下: function execute(id, max) { console.log('starting ' + id); console.time(id); var sum = 0; for(var i = 0; i < max; i ++) { sum += i; } console.timeEnd(id); return sum; }

据我从文档中了解,可以同时运行两个或多个函数,并等待所有函数完成。所以我试了一下:

function execute(id, max) {
    console.log('starting ' + id);

    console.time(id);
    var sum = 0;
    for(var i = 0; i < max; i ++) {
        sum += i;
    }
    console.timeEnd(id);
    return sum;
}

console.log("Declaring p1");
var p1 = Promise.resolve(() => execute("p1", 10000));
console.log("Declaring p2");
var p2 = Promise.resolve(() => execute("p2", 100000));

console.log("Calling Promise.all");
console.time("all"); 
Promise.all([p1, p2]).then((values) => console.log("Then: " + values));
console.timeEnd("all");
显然,不仅函数没有运行,而且
然后
方法得到了它们,结果也没有

即使我用最初的函数调用替换了承诺,我也得到了同样的结果:

function execute(id, max) {
    console.log('starting ' + id);

    console.time(id);
    var sum = 0;
    for(var i = 0; i < max; i ++) {
        sum += i;
    }
    console.timeEnd(id);
    return sum;
}

console.log("Calling Promise.all");
console.time("all");
Promise.all([() => execute("p1", 10000), () => execute("p2", 100000)])
  .then((values) => console.log("Then: " + values));
console.timeEnd("all");
因此,我认为我误解了
承诺。所有
用法。如何使用承诺执行并行处理

谢谢


拉斐尔·阿方索(Rafael Afonso)

承诺。所有人都接受一系列承诺,并在所有承诺都得到解决或其中一个被拒绝后立即做出决定。但根据规范,承诺并不是异步的,事实上,完全相反的是正确的:立即执行。所以,如果你的所有执行者都是同步的,那么你的承诺链就是同步的

也许这有助于理解它的工作原理:

函数执行(id,最大值){
console.log('starting'+id);
控制台时间(id);
var总和=0;
对于(变量i=0;i{
log('设置超时..');
setTimeout(()=>resolve(execute(2,10)),2000;
})
console.log(“调用Promise.all”);
时间(“全部”);
控制台。时间(“结果”);
承诺。所有([p1,p2])
.然后((结果)=>{
console.log(“所有结果”,结果);
console.timeEnd(“结果”);
})
.catch(console.error.bind(console));
console.timeEnd(“全部”);//答应我,所有人马上回来
这就是输出:

声明p1
开始1
1:0.016ms
声明p2
设置超时。。
打电话给Promise.all
全部:0.097毫秒
开始2
2:0.002ms
所有结果[45,45]
结果:2001.144ms
通常,在调用某些异步API时使用承诺。但如果您真的想异步运行自己的javascript,则需要使用Web Workers或其他工具,具体取决于您的平台


编辑:一些关于网络工作者和承诺的快速谷歌搜索,有一个好看的图书馆。我说的好看是指100%的覆盖率和自动浏览器测试。如果您想走这条路,可能值得检查,甚至安装。

承诺。所有承诺都接受一系列承诺,并在所有承诺都解决或其中一个拒绝时立即解决。但根据规范,承诺并不是异步的,事实上,完全相反的是正确的:立即执行。所以,如果你的所有执行者都是同步的,那么你的承诺链就是同步的

也许这有助于理解它的工作原理:

函数执行(id,最大值){
console.log('starting'+id);
控制台时间(id);
var总和=0;
对于(变量i=0;i{
log('设置超时..');
setTimeout(()=>resolve(execute(2,10)),2000;
})
console.log(“调用Promise.all”);
时间(“全部”);
控制台。时间(“结果”);
承诺。所有([p1,p2])
.然后((结果)=>{
console.log(“所有结果”,结果);
console.timeEnd(“结果”);
})
.catch(console.error.bind(console));
console.timeEnd(“全部”);//答应我,所有人马上回来
这就是输出:

声明p1
开始1
1:0.016ms
声明p2
设置超时。。
打电话给Promise.all
全部:0.097毫秒
开始2
2:0.002ms
所有结果[45,45]
结果:2001.144ms
通常,在调用异步API时,承诺被使用。但如果您真的想异步运行自己的javascript,则需要使用Web Workers或其他工具,具体取决于您的平台


编辑:一些关于网络工作者和承诺的快速谷歌搜索,有一个好看的图书馆。我说的好看是指100%的覆盖率和自动浏览器测试。如果您想走这条路,可能值得检查甚至安装。

可以同时运行两个异步函数并等待它们的结果。你的循环不是异步的。你能给我举个例子吗?你想说在函数中使用承诺吗?他说承诺不会异步执行代码;它们执行异步代码。您可能在该系列中寻找真正的并行性。可以同时运行两个异步函数并等待它们的结果。你的循环不是异步的。你能给我举个例子吗?你想说在函数中使用承诺吗?他说承诺不会异步执行代码;它们执行异步代码。你可能在家族中寻找真正的平行性。
function execute(id, max) {
    console.log('starting ' + id);

    console.time(id);
    var sum = 0;
    for(var i = 0; i < max; i ++) {
        sum += i;
    }
    console.timeEnd(id);
    return sum;
}

console.log("Calling Promise.all");
console.time("all");
Promise.all([() => execute("p1", 10000), () => execute("p2", 100000)])
  .then((values) => console.log("Then: " + values));
console.timeEnd("all");
Calling Promise.all
all: 0.274ms
Then: () => execute("p1", 10000),() => execute("p2", 100000)