我对承诺很新,并且很难理解这一点:我有一个承诺,它会返回一个值列表。我如何从这些价值观中开始一个新的承诺?
以下是我尝试使用的一些示例代码:
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);
}
答案 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
。
不,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.");
});
或在循环中创建的每个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.");
});