function levelOne(value, callback) { var newScore = value + 5; callback(newScore); }
function levelTwo(value, callback) { var newScore = value + 10; callback(newScore); }
function levelThree(value, callback) { var newScore = value + 30; callback(newScore); }
function startGame() { var currentScore = 5; console.log('Game Started! Current score is ' + currentScore); levelOne(currentScore, function(levelOneReturnedValue) { console.log('Level One reached! New score is ' + levelOneReturnedValue); levelTwo(levelOneReturnedValue, function(levelTwoReturnedValue) { console.log('Level Two reached! New score is ' + levelTwoReturnedValue); levelThree(levelTwoReturnedValue, function(levelThreeReturnedValue) { console.log('Level Three reached! New score is ' + levelThreeReturnedValue); }); }); });
}
startGame();
执行以上代码,控制台输出是这样的:
"Game Started! Current score is 5" "Level One reached! New score is 10" "Level Two reached! New score is 20" "Level Three reached! New score is 50"
// 当一切正常时,调用resolve函数;否则调用reject函数 var promise = new Promise(function(resolve, reject) { if ( /* everything turned out fine */ ) { resolve("Stuff worked!"); } else { reject(Error("It broke")); } });
我们将前文陷入回调地狱的例子使用Promise改写:
function levelOne(value) { var promise, newScore = value + 5; return promise = new Promise(function(resolve) { resolve(newScore); }); }
function levelTwo(value) { var promise, newScore = value + 10; return promise = new Promise(function(resolve) { resolve(newScore); }); }
function levelThree(value) { var promise, newScore = value + 30; return promise = new Promise(function(resolve) { resolve(newScore); }); }
var startGame = new Promise(function(resolve, reject) { var currentScore = 5; console.log('Game Started! Current score is ' + currentScore); resolve(currentScore); });
// startGame返回的结果传递给了then函数,然后传递给了levelOne函数 startGame.then(levelOne) .then(function(result) { // result为levelOne函数的返回值 console.log('You have reached Level One! New score is ' + result); return result; }) .then(levelTwo) .then(function(result) { console.log('You have reached Level Two! New score is ' + result); return result; }) .then(levelThree) .then(function(result) { console.log('You have reached Level Three! New score is ' + result); });
执行以上代码,控制台输出还是这样的:
"Game Started! Current score is 5" "Level One reached! New score is 10" "Level Two reached! New score is 20" "Level Three reached! New score is 50"
function levelOne(value) { var promise, newScore = value + 5; return promise = new Promise(function(resolve) { resolve(newScore); }); }
function levelTwo(value) { var promise, newScore = value + 10; return promise = new Promise(function(resolve) { resolve(newScore); }); }
function levelThree(value) { var promise, newScore = value + 30; return promise = new Promise(function(resolve) { resolve(newScore); }); }
// 只有aysnc函数内可以使用await语句 async function startGame() { var currentScore = 5; console.log('Game Started! Current score is ' + currentScore); currentScore = await levelOne(currentScore); console.log('You have reached Level One! New score is ' + currentScore); currentScore = await levelTwo(currentScore); console.log('You have reached Level Two! New score is ' + currentScore); currentScore = await levelThree(currentScore); console.log('You have reached Level Three! New score is ' + currentScore); }
startGame();
执行以上代码,控制台输出依然是这样的:
"Game Started! Current score is 5" "Level One reached! New score is 10" "Level Two reached! New score is 20" "Level Three reached! New score is 50"