Я хотел бы показать, насколько чистые объекты, отложенные jQuery, могут сделать код вместо использования «callback hell».jQuery Promise/Deferred nicer Код, чем callbacks? Как это сделать?
У меня нет возможности переключиться на Javascript's Promises.
Вот "плохой" код:
/* Callback Hell !? */
// Main
var stringToProcess = "1,2,3,4,5,6";
console.debug("Main Stack: start");
convertStringToArray(stringToProcess, function (convertedString){
convertToObject(convertedString, function(objectOfStrings){
resetObjectValues(objectOfStrings, function(object){
console.debug(object);
});
});
});
console.debug("Main Stack: end");
// Functions
function resetObjectValues(object, callback){
for(var key in object){
object[key] = "X";
}
setTimeout(function thirdcb(){
callback(object);
}, 500);
}
function convertToObject(string, callback){
var object = {};
string.map(function(current, index){
object[index] = current;
});
setTimeout(function secondcb(){
callback(object);
}, 500);
}
function convertStringToArray(string, callback){
var delimiter = ",";
var arrayString = string.split(delimiter);
setTimeout(function firstcb(){
callback(arrayString);
}, 500);
}
И вот как я пытался сделать это лучше:
/* Promise Heaven... */
// Main
var stringToProcess = "1,2,3,4,5,6";
console.debug("Main Stack: start");
var promise;
promise = convertStringToArray(stringToProcess);
promise.done(function(string){
promise = convertToObject(string);
promise.done(function(object){
promise = resetObjectValues(object);
promise.done(function(object){
console.debug(object);
})
})
});
console.debug("Main Stack: end");
// Functions
function resetObjectValues(object, callback){
var deferred = $.Deferred();
for(var key in object){
object[key] = "X";
}
setTimeout(function thirdcb(){
deferred.resolve(object);
}, 500);
return deferred.promise();
}
function convertToObject(string){
var deferred = $.Deferred();
var object = {};
string.map(function(current, index){
object[index] = current;
});
setTimeout(function secondcb(){
deferred.resolve(object);
}, 500);
return deferred.promise();
}
function convertStringToArray(string){
var deferred = $.Deferred();
var delimiter = ",";
var arrayString = string.split(delimiter);
setTimeout(function firstcb(){
deferred.resolve(arrayString);
}, 500);
return deferred.promise();
}
... печально код .done() выглядит почти так же плохо, как «ад». Я не могу понять, как правильно связывать обещания/отсрочки. Я видел учебники, где они делают это без аргументов для вызовов функций. Но у меня есть аргументы, чтобы бросить - так, как ладить с этим?
Это ваш код только для демонстрационных целей, так как он не должен быть асинхронным вообще. –
Вы должны использовать ['then'] (http://api.jquery.com/deferred.then/) вместо' done', чтобы вы могли [сгладить цепочку] (http: // stackoverflow. com/a/22000931/1048572): 'convertStringToArray (stringToProcess). then (convertToObject). then (resetObjectValues) .then (console.debug.bind (консоль));' – Bergi