我試圖用Q.js
來處理在Web應用程序與promises
和deferrable
一些問題 - 我會說我的理解async
開始基本爲0現在。這是我第一次真正嘗試它,而且我真的即使在閱讀儘可能多的文檔後也會丟失。通過文件試圖循環與Q.js
我先前使用庫稱爲jsdeferred
實現如下的代碼;它遍歷一系列文件並加載它們,並將它們添加到數組中。但是,因爲我已經知道我不應使用jsdeferred
,我被告知我應該使用promises
和deferrables
正確。
我已經探索了很多這方面的場地,我可能只是愚蠢的,但我有一個非常困難的時間實現這個確切的代碼在承諾導向庫(在這個例子中,我試圖用Q.js
,與沒有成功)。
Q.js Library
define(function() {
return function (selector, callback) {
var files = [
"/app_content/json/ecma5.json",
"/app_content/json/jquery.json",
"/app_content/json/tangent.json"
];
var results = [];
var editor, server;
return Deferred.loop(files.length, function (i) {
return $.get(files[i]).next(function(data) {
results.push(data);
});
}).next(function() {
// a lot of things happen here. they are amazing things.
}).next(function() {
// seriously, this stuff is awesome.
}).next(function() {
callback(editor);
});
};
});
我專門有一個非常艱難的時間與文件加載/循環,任何幫助,將不勝感激。我想,一旦我在這裏站穩腳跟,我將能夠更好地進行,但是這種文件循環真的讓我失望。我一直在閱讀文檔的一切似乎都是一次性使用場景。
我仍在閱讀文檔,我將繼續這樣做,但如果任何人都可以幫助我在這裏立足,我將不勝感激。一旦我看到它與我自己的東西一起工作,我就更容易接受其他情況。我有大約20個需要開始使用這個概念的地方,但這是第一個令我頭痛的地方。
更新
我不有使用Q.js
,它是剛來到最值得推薦的一個。如果它能解決我的問題,我也在尋找https://github.com/caolan/async
。
進一步更新
與文檔的更多,我已經合併的工作代碼的東西,但它似乎仍然失去了一些東西。我無法將results
作爲參數傳遞給每個then(fn)
,我必須將其保留爲外部變量。
var results = [];
var editor, server;
var chain = files.reduce(function (previous, item) {
return previous.then(function(previousValue) {
return Q.resolve($.get(item, function(data) {
results.push(data);
}));
});
}, Q.resolve());
chain
.then(function (results) {
})
.then(function (results) {
// I can't seem to get results to pass through the 2nd 'next'.
})
.then(function() {
callback(editor);
});
最終結果
在大家的幫助下在這裏,我終於做出此代碼的工作我多麼希望。這是最終結果。這是CodeMirror使用tern和自定義腳本定義的實現。
define(function() {
return function (selector, callback) {
var editor, server, results, files = [
"/app_content/json/ecma5.json",
"/app_content/json/jquery.json",
"/app_content/json/tangent.json"
];
Q
.all(files.map($.get))
.then(function(data) {
results = data;
})
.then(function() {
editor = CodeMirror.fromTextArea(selector[0], {
mode: { name: "javascript", globalVars: true },
lineNumbers: true,
lineWrapping: true,
matchBrackets: true,
indentUnit: 2,
tabMode: "spaces",
autoCloseBrackets: true,
matchTags: true,
highlightSelectionMatches: true,
continueComments: "Enter",
foldGutter: true,
width: "100%",
gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"],
extraKeys: {
"Ctrl-Space": "autocomplete",
"Ctrl-Q": function(cm) { cm.foldCode(cm.getCursor()); }
}
});
})
.then(function() {
server = new CodeMirror.TernServer({
defs: results
});
editor.setOption("extraKeys", {
"Ctrl-Space": function(cm) { server.complete(cm); },
"Ctrl-I": function(cm) { server.showType(cm); },
"Alt-.": function(cm) { server.jumpToDef(cm); },
"Alt-,": function(cm) { server.jumpBack(cm); },
"Ctrl-Q": function(cm) { server.rename(cm); },
});
editor.on("cursorActivity", function(cm) { server.updateArgHints(cm); });
})
.then(function() {
callback(editor);
})
.done();
};
});
我提供極端,極端感謝這裏提供的建設性的,有用的,有用的和知識淵博的信息。
哇,很多很棒的答案。我已經嘗試過所有,他們都工作。我需要時間考慮哪一個我需要接受作爲正確的一個。 – Ciel