// I'm sure you've seen a JQuery code snippet like this at some point in your life!// The parameter we're passing to the `click` method here is a callback function.$("button").click(function(){alert('clicked on button`);
});
简单吧?现在让我们实现一个回调函数,用于在一个虚拟游戏中获取升级分数。
// levelOne() is called a high-order function because // it accepts another function as its parameter. function levelOne(value, callback) { var newScore = value + 5; callback(newScore); } // Please note that it is not mandatory to reference the callback function (line #3) as callback, it is named so just for better understanding. function startGame() { var currentScore = 5; console.log('Game Started! Current score is ' + currentScore); // Here the second parameter we're passing to levelOne is the // callback function, i.e., a function that gets passed as a parameter. levelOne(currentScore, function (levelOneReturnedValue) { console.log('Level One reached! New score is ' + levelOneReturnedValue); }); } startGame();
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); } // Note that it is not needed to reference the callback function as callback when we call levelOne(), levelTwo() or levelThree(), it can be named anything. 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();
// This is how a sample promise declaration looks like. The promise constructor// takes one argument which is a callback with two parameters, `resolve` and// `reject`. Do something within the callback, then call resolve if everything// worked, otherwise call reject.varpromise=newPromise(function(resolve,reject){// do a thing or twentyif (/* everything turned out fine */){resolve("Stuff worked!");}else{reject(Error("It broke"));}});
现在让我们尝试用承诺重写我们的回调地狱示例。
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); }); // The response from startGame is automatically passed on to the function inside the subsequent then startGame.then(levelOne) .then(function (result) { // the value of result is the returned promise from levelOne function 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); });
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); }); } // the async keyword tells the javascript engine that any function inside this function having the keyword await, should be treated as asynchronous code and should continue executing only once that function resolves or fails. 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();