代码之家  ›  专栏  ›  技术社区  ›  Natjo

如何从承诺返回的列表中生成多个承诺

  •  -1
  • Natjo  · 技术社区  · 6 年前

    我对承诺很陌生,很难理解这一点:我有一个承诺,它会返回一系列价值观。我如何从这些价值观中开始新的承诺?

    下面是我尝试使用的一些示例代码:

    var generateList = new Promise(
        function (resolve, reject) {
            var color = ["black", "white"];
            resolve(color);
        }
    );
    
    var showColor = function (color) {
        console.log("Color: " + color);
    };
    
    function handleList(list){
        var somePromises = [];
        somePromises[0] = Promise.resolve(list[0]);
        somePromises[1] = Promise.resolve(list[1]);
        // somePromises = [promise0, promise1];
        // var somePromises = list.map(Promise.resolve);
        return somePromises;
    }
    
    var startPromises = function () {
        generateList.then(handleList).then(showColor);
    };
    
    startPromises();
    

    我想 showColor 两次调用,在各自的行中打印两种颜色。我怎样才能做到这一点?我试着用 Promise.all ,但无法使其工作。


    编辑

    我可能把我的问题简单化了。我想在每个列表元素上调用一个新的承诺(总是相同的链)。

    var makeCapital = function (word){
        new Promise(function (resolve, reject){
            resolve(word.toUpperCase());
        });
    };
    

    然后像这样延伸我的链条:

    var startPromises = function () {
        generateList.then(handleList).then(makeCapital).then(showColor);
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Bergi    6 年前

    是的,你应该使用 Promise.all

    makeCapital showColor 当它们作为 then 回调,在您的 generateList.….then(makeCapital).then(showColor) 链条没有办法写一个 .then(handleList) 这改变了这一点。

    你需要在你的 handleList 功能-作为

    generateList.then(function makeCapitalList(list) {
        var somePromises = list.map(makeCapital);
        return Promise.all(somePromises);
    }).then(function showColorList(colors) {
        colors.forEach(showColor); // or use `map` if they return something sensible
                                   // and also `Promise.all` again if they return promises
        console.log("all done.");
    });
    

    或使用 showColor公司 循环中创建的每个承诺的处理程序:

    generateList.then(function handleList(list) {
        var somePromises = list.map(color => {
            var somePromise = makeCapital(color).then(showColor);
            return somePromise;
        });
        return Promise.all(somePromises);
    }).then(() => {
        console.log("all done.");
    });
    
        2
  •  1
  •   Ele    6 年前
    • 你应该回去 Promise.all(somePromises);
    • 循环中的每种颜色 listOfColors 函数返回的 handleList :

    var generateList = new Promise(
        function (resolve, reject) {
            var color = ["black", "white"];
            resolve(color);
        }
    );
    
    var showColor = function (color) {
        console.log("Color: " + color);
    };
    
    function handleList(list){
        var somePromises = [
          Promise.resolve(list[0]),
          Promise.resolve(list[1])
        ];
        
        return Promise.all(somePromises);
    }
    
    var startPromises = function () {
        generateList.then(handleList).then(function(listOfColors) {
          // This forEach will call the function showColor twice.
          listOfColors.forEach(c => showColor(c)); 
        });
    };
    
    startPromises();
    .as-console-wrapper { max-height: 100% !important; top: 0; }