@冒泡的马树
题库原地址:http://csbin.io/promises
Promises 期约
挑战 1
问题:
让咱们从温习异步函数开始吧!应用 setTimeout,在 1000ms 后打印字符串“Hello!”。
题解:
// Challenge 1
function sayHello() {
// ADD CODE HERE
setTimeout(() => console.log('Hello!'), 1000)
}
// Uncomment the line below when ready
sayHello(); // should log "Hello" after 1000ms
挑战 2
问题:
创立一个 promise。提早 1000ms 后在 resolve 外面传入值“Resolved!”,应用 setTimeout。在 promise 被调用 resolve 后,打印它的内容,借助传入 console.log 到.then 中来实现。
题解:
// Challenge 2
var promise = new Promise(function (resolve, reject) {
// ADD CODE HERE
setTimeout(() => resolve('Resolved'), 1000)
});
// Should print out "Resolved!"
// ADD CODE HERE
promise.then(res => console.log(res))
挑战 3
问题:
创立另外一个 promise。这次不应用 setTimeout,在 reject 外面传入值“Rejected!”。在 promise 被调用 reject 之后,打印它的内容,借助传入 console.log 到.catch 来实现。
题解:
// Challenge 3
promise = new Promise(function(resolve, reject) {
// ADD CODE HERE
reject('Rejected')
})
// Should print out "Reject!"
// ADD CODE HERE
promise.catch(res => console.log(res))
挑战 4
问题:
Promises 期约是异步的。当初让咱们来证实它们的确如此!创立一个 promise,在 resolve 外面传入值“Promise has been resolved!”,而后去掉挑战 4 底部的正文。运行后咱们看到的打印程序是怎么的?“Promise has been resolved!”先还是 ”I’m not the promise!” 先?为什么?
题解:
// Challenge 4
promise = new Promise(function (resolve, reject) {
// ADD CODE HERE
resolve()});
// Uncomment the lines below when ready
promise.then(() => console.log('Promise has been resolved!'));
console.log("I'm not the promise!");
挑战 5
问题:
编写 delay 函数,用于返回一个 promise。此返回 promise 应该返回一个在 1000ms 后调用 resolve 的 setTimeout。
题解:
// Challenge 5
function delay(){return new Promise(function (resolve, reject) {return setTimeout(resolve, 1000)
})
}
// Uncomment the code below to test
// This code should log "Hello" after 1000ms
delay().then(sayHello);
挑战 6
问题:
在这个挑战中咱们会应用.then 链式调用 promises 期约。创立两个变量:firstPromise 和 secondPromise,让 secondPromise 成为一个在 resolve 中传值“Second!”的 promise,firstPromise 则在 resolve 中传入 secondPromise。用.then 的形式调用 firstPromise,这会返回 secondPromise,而后在它的 resolve 执行之后,打印对应 promise 的内容,借助传入 console.log 到.then 来实现。
题解:
// Challenge 6
//
// ADD CODE BELOW
var secondPromise = Promise.resolve('Second!')
var firstPromise = new Promise(function (resolve, reject) {resolve(secondPromise)
})
firstPromise.then().then(res => console.log(res))
挑战 7
问题:
咱们有一个会从数据库拉取数据的 API,它接管一个下标参数而后返回一个 promise。你的挑战是应用 promise.all 发动 3 次 API 调用,而后在调用都完结后返回对应的数据。
题解:
// Challenge 7
const fakePeople = [{ name: 'Rudolph', hasPets: false, currentTemp: 98.6},
{name: 'Zebulon', hasPets: true, currentTemp: 22.6},
{name: 'Harold', hasPets: true, currentTemp: 98.3},
]
const fakeAPICall = (i) => {const returnTime = Math.floor(Math.random() * 1000);
return new Promise((resolve, reject) => {if (i >= 0 && i < fakePeople.length) {setTimeout(() => resolve(fakePeople[i]), returnTime);
} else {reject({ message: "index out of range"});
}
});
};
function getAllData() {
// CODE GOES HERE
return Promise.all([fakeAPICall(0), fakeAPICall(1), fakeAPICall(2)])
}
getAllData().then(res => console.log(res))