如何从promise

时间:2018-03-08 16:21:16

标签: javascript promise

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

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

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,但无法使其正常工作。

修改

我可能过分简化了我的问题。我想在每个列表元素上调用一个新的(总是相同的)Promise。

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

并像这样扩展我的链:

var startPromises = function () {
    generateList.then(handleList).then(makeCapital).then(showColor);
}

2 个答案:

答案 0 :(得分:1)

  • 您应该返回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; }




答案 1 :(得分:1)

是的,您应该使用Promise.all

不,makeCapitalshowColor只会在您的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.");
});

或在循环中创建的每个promises上使用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.");
});