我有一個任務來創建一個函式summarize1,它接收promise并回傳promise及其值的總和,如下所示:
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve) => resolve(2));
summarize1(promise1, promise2).then((sum) => {console.log(sum);}); // result: 6
使用此測驗實作:
describe('summarize1', () => {
it('should return 9 for given promises', async () => {
const promise1 = Promise.resolve(9);
const res = await summarize1(promise1);
assert.strictEqual(res, 9);
});
it('should return 6 for given promises', async () => {
const promise1 = Promise.resolve(2);
const promise2 = Promise.resolve(4);
const res = await summarize1(promise1, promise2);
assert.strictEqual(res, 6);
});
it('should return 11 for given promises', async () => {
const promise1 = Promise.resolve(3);
const promise2 = new Promise(resolve => resolve(9));
const res = await summarize1(promise1, promise2);
assert.strictEqual(res, 12);
});
it('should return 16 for given promises', async () => {
const promise1 = Promise.resolve(10);
const promise2 = new Promise(resolve => resolve(5));
const promise3 = new Promise(resolve => {setTimeout(() => {resolve(1)}, 300)});
const res = await summarize1(promise1, promise2, promise3);
assert.strictEqual(res, 16);
});
});
和一個異步函式呼叫summarize2接收承諾并回傳與他們的值的總和承諾如summarize1所示的上方。通過這個測驗:
describe('summarize2', () => {
it('should return 9 for given promises', async () => {
const promise1 = Promise.resolve(9);
const res = await summarize2(promise1);
assert.strictEqual(res, 9);
});
it('should return 6 for given promises', async () => {
const promise1 = Promise.resolve(2);
const promise2 = Promise.resolve(4);
const res = await summarize2(promise1, promise2);
assert.strictEqual(res, 6);
});
it('should return 11 for given promises', async () => {
const promise1 = Promise.resolve(3);
const promise2 = new Promise(resolve => resolve(9));
const res = await summarize2(promise1, promise2);
assert.strictEqual(res, 12);
});
it('should return 16 for given promises', async () => {
const promise1 = Promise.resolve(10);
const promise2 = new Promise(resolve => resolve(5));
const promise3 = new Promise(resolve => {setTimeout(() => {resolve(1)}, 300)});
const res = await summarize2(promise1, promise2, promise3);
assert.strictEqual(res, 16);
});
it('should return 23 for given promises', async () => {
const promise1 = Promise.resolve(11);
const promise2 = new Promise(resolve => resolve(7));
const promise3 = new Promise(resolve => {setTimeout(() => {resolve(5)}, 500)});
const res = await summarize2(promise1, promise2, promise3);
assert.strictEqual(res, 23);
});
it('should return 16 for given promises', async () => {
const promise1 = new Promise(resolve => {setTimeout(() => {resolve(1)}, 500)});
const promise2 = new Promise(resolve => {setTimeout(() => {resolve(3)}, 500)});
const promise3 = new Promise(resolve => {setTimeout(() => {resolve(5)}, 500)});
const promise4 = new Promise(resolve => {setTimeout(() => {resolve(7)}, 500)});
const res = await summarize2(promise1, promise2, promise3, promise4);
assert.strictEqual(res, 16);
});
it('should return 42 for given promises', async () => {
const promise1 = Promise.resolve(21);
const promise2 = Promise.resolve(21);
const res = await summarize2(promise1, promise2);
assert.strictEqual(res, 42);
});
});
問題是我不明白如何實作這個任務來滿足條件,能夠創建我們想要的盡可能多的承諾,然后只是從解決方案中獲得它們的價值總和。
我嘗試了 4 次,但沒有任何效果,我不知道該做什么了,我搜索了所有檔案、每個參考資料,但對我需要的內容一無所知。PS:我是 JS 新手
這是我的第一次嘗試:
new Promise((resolve) => resolve(value));
function sum(value){
return new Promise((resolve)=>{
resolve(value value);
});
}
第二次嘗試:
async function getFirstPromise(){
return new Promise((resolve)=>resolve(value1));
}
async function getSecondPromise(){
return new Promise((resolve)=>resolve(value2));
}
const sum = new Promise((resolve)=>{
var promise1 = await getFirstPromise();
var promise2 = await getSecondPromise();
resolve(promise1 promise2);
})
return sum.then(function(sum){
console.log(sum);
});
第三次嘗試:
const promise1 = new Promise(function (resolve) {
setTimeout(() => {
resolve(value);
}, 1000);
});
const promise2 = new Promise(function (resolve) {
setTimeout(() => {
resolve(value);
}, 1000);
});
const sum = new Promise(function (resolve) {
setTimeout(() => {
resolve(promise1 promise2);
}, 1000);
});
sum.then(function () {
return sum;
});
最后:
let promise1;
let promise2;
let sum = new Promise((resolve)=>{
resolve(sum);
});
sum.then((value)=>{
return value;
})
也許我走在正確的道路上,但由于缺乏經驗,我不知道我應該做什么和期待什么。請幫助。提前致謝。
uj5u.com熱心網友回復:
你錯過了一些 JavaScript 可以做的關鍵部分
- 使用其余引數在函式中獲取可變數量的引數
- 使用Promise.all等待多個Promise解決,然后執行某些操作
const summarize1 = (...promises) => {
return Promise.all(promises).then(nums => {
let sum = 0;
for (const num of nums) {
sum = num;
}
return sum;
})
}
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve) => resolve(2));
summarize1(promise1, promise2).then((sum) => {
console.log(sum);
});
既然你提到你是 JS 的新手,我沒有使用任何必要的東西來解釋上面的解決方案。但是,陣列上有一個實用函式,稱為reduce,可以用來代替上面的 for 回圈
const summarize1 = (...promises) => {
return Promise.all(promises).then(nums => nums.reduce((sum, ele) => sum ele));
}
const promise1 = Promise.resolve(4);
const promise2 = new Promise((resolve) => resolve(2));
summarize1(promise1, promise2).then((sum) => {
console.log(sum);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/360675.html
標籤:javascript 异步 承诺 任务
上一篇:組合-合并多個共享過濾器
