JavaScript和Promise.all()

时间:2018-05-02 18:48:14

标签: javascript arrays promise

我尝试使用print i的承诺加载一堆资源异步。加载代码是一个试图将其全部链接的灾难,我需要一个更清洁的解决方案。

我想出的是下面的内容。这显然没有做任何事情,因为它是垃圾代码,但我需要知道加载任何资源是否有失败,我需要知道它们何时完成。

Jimp.js

出于某种原因,这绝不会输出"糟糕"

这是一个失败的输出:

  

[' SUCCESS',' 1',0.756461151774289]   空

我在这里缺少什么?

更新

我接受了我收到的一部分答案并对其进行了更改,以使其完全符合我的要求:

function doSomething(asdf) {
  return new Promise((resolve, reject) => {
    //console.log("It is done.");
    // Succeed half of the time.
    var x = Math.random();    
    if (x > .5) {
      resolve(["SUCCESS",asdf,x])
    } else {
      reject(["Failure",asdf,x])
    }
  });
}



func();

function func() {
    //Imagine a is actually an image loaded by doSomething
    var a=null;  doSomething("1").then(function (data) {a = data;},
            (err) => {throw new err;});
    //Imagine b is a font resource.
    var b=null;  doSomething("2").then(function (data) {b = data;},
            (err) => {throw new err;});

    Promise.all([a, b]).then(function() {
            console.log(a);
            console.log(b);
            //Then here I expect everything to be correct, and continue on with the next function.
    }, 
    (err) => {console.log('Oops:' + err);}).
     catch( (err) => {console.log('Oops:' + err);});
}

更新

以下是我现在正在使用的实际代码:

function func() {
    var a=doSomething("1").then(function (data) {a = data;});
    var b=doSomething("2").then(function (data) {b = data;});

    Promise.all([a, b]).then(function() {
            console.log(a);
            console.log(b);
    }, 
    (err) => {console.log('Reject:' + err);});
}

3 个答案:

答案 0 :(得分:2)

您无法将这些ab变量用于图片。 (有关将传递到Promise.all的值),请参阅here。您需要为doSomething()返回的promise对象使用变量。这些图片只能在then回调中使用 - Promise.all会创建一个符合结果数组的承诺:

function func() {
    // aPromise is a promise for an image loaded by doSomething
    var aPromise = doSomething("1");
    // bPromise is a promise for a font resource.
    var bPromise = doSomething("2");

    Promise.all([aPromise, bPromise]).then(function([a, b]) {
//                                                  ^^^^^^
        console.log(a);
        console.log(b);
        // Then here I expect everything to be correct, and continue on with the next function.
    }, (err) => {
        console.log('Oops:' + err);})
    });
}

答案 1 :(得分:1)

  Promise.all([a, b])

因为您将a设置为b,因此nullnulla。因此,Promise.all将不会等待,它将在之后解决一个滴答,并且ba得到快速解决/拒绝,这可能发生在b /之前 console.log(a) 在到达

之前设置
 "echo 'Installing docker",
 "sudo groupadd docker",

 "sudo usermod -aG docker {{user `service_user`}}",
 "sudo usermod -aG docker {{user `config_user`}}",
 "newgrp docker",

 "echo 'Install docker-compose",

将记录正确的结果有时,但这基于偶然。

答案 2 :(得分:1)

Promise.all返回一个承诺,此承诺包含先前承诺的结果

Promise.all([ doSomething('1'), doSomething('2')])
  .then(results => {
    // results is an array which contains the result of the previous promises
    const [a, b] = results
  }).catch(err => console.log('Oops:' + err))