在下面的代碼中,每當任何一個延遲對象失敗時,我需要退出for循環。每當循環大寫字母red
或yellow
顏色失敗,我想避免其他延遲執行。當任何jQuery延遲失敗時退出for循環
var colours = ['violet', 'indigo', 'blue', 'green', 'yellow', 'orange', 'red'];
var capitalize = function(text) {
var deferred = $.Deferred(),
delay = (1 + Math.floor(Math.random() * 5)) * 500;
setTimeout(function() {
if (text === 'red' || text === 'yellow') {
deferred.reject('error colour', true);
} else {
deferred.resolve(text.toUpperCase());
}
}, delay);
return deferred.promise();
}
var deferreds = [],
result = [];
for (var i = 0; i < colours.length; i++) {
var deferred = capitalize(colours[i]);
deferred.done(function(t) {
console.log(t);
result.push(t);
}).fail(function(e) {
console.log(e);
});
deferreds.push(deferred);
}
$.when.apply($, deferreds).done(function(){
console.log(result);
}).fail(function(e){
console.log(e);
});
編輯:
我建立與骨幹科爾多瓦基於移動應用程序。我必須使用localStorage進行持久化,並且必須在持久化之前加密所有數據。雖然使用本地存儲來存儲/檢索數據是同步的,但要加密/解密數據,我必須調用異步的本機設備API。我想過使用Backbone.localstorage插件,但它不是針對異步開發的......所以沒什麼用處!
我正在開發自己的插件。除了一種方法,我幾乎完成了大部分代碼,即findAll
。
findAll
方法返回存儲在localstorage中的所有模型。
// exiting method in the Backbone.Localstorage plugin
extend(Backbone.LocalStorage.prototype, {
// ...
findAll: function() {
var result = [];
for (var i = 0, id, data; i < this.records.length; i++) {
id = this.records[i];
data = this.serializer.deserialize(this.localStorage().getItem(this._itemName(id)));
if (data != null) result.push(data);
}
return result;
}
});
在localstorage中,所有模型都被加密並存儲爲字符串。在反序列化回模型之前,我必須解密它們。 this.crypto
類解密從localstorage返回的字符串,並反序列化回模型。加密/解密是aysnc,所以它返回一個承諾。
// Method in my new plugin
findAll: function() {
var deferred = $.Deferred(),
deferreds = [],
result = [],
errors = [];
// this.records contains all the model ids
for (var i = 0, id, data; i < this.records.length; i++) {
id = this.records[i];
// this.crypto return a promise with the backbone model as parameter
var d = this.crypto.deserialize(this.localStorage().getItem(this._itemName(id)));
d.done(function(model) {
// I've to maintain the order in result so storing the index
result.push({ index: i, model: model });
}).fail(function(error) {
errors.push(error);
});
deferreds.push(d);
}
$.when.apply($, deferreds)
.done(function() {
// TODO: sort the result based on i and resolve it
deferred.resolve(sortedResult);
})
.fail(...);
return deferred.promise();
}
解密時可能會出現錯誤,在這種情況下,我必須停止整個過程。
您的回答非常有幫助。謝謝。 – VJAI 2014-11-25 05:49:03
我得到**不確定是不是一個功能**錯誤在這行'返回Array.prototype.apply(參數)'我覺得應該是'Array.prototype.slice.call(參數)'吧? – VJAI 2014-11-25 06:44:18
是的,正是如此,我忘記了.slice'。發現得好。 – 2014-11-25 09:30:43