Ich bin neugierig zu wissen, wie kann ich Bluebird Versprechen in meinem vorhandenen Javascript-Code, der viele Callback-basierte Mechanismen nutzt. Hier ist das Szenario:Wie man Bluebird Versprechen auf meine vorhandene Javascript Traversal und rekursive basierte Logik anwenden?
In meiner Web-Anwendung auf Seite Last mit jQuery, ich Seite Hauptmenü Links erhalten und eine TreeModel Struktur von ihnen erzeugen, die ich später verwenden werde ein Brotkrumen auf Seite oben zu zeigen.
Die Funktion, die ich für die Erzeugung dieses TreeModel bin mit folgt:
function _traverseNodeChildren(selector, parentNode, callback1, callback2) {
$(parentNode.model.element).find(selector).each(function(idx, elm) {
// Create a Tree Node using TreeModel
let node = _createTreeNode.apply(this.comp, [elm]);
this.parentNode.addChild(node);
let hasChildren = $(elm).find("+ul.dropdown-menu").length > 0;
if (hasChildren == true)
_traverseNodeChildren.apply(this.comp, ["+ul.dropdown-menu > li > a", node, callback1, callback2]);
if (node.model.id == "aboutLink") // last node
{
setTimeout(() => {
callback1.apply(this.comp, [callback2]);
}, 100);
}
}.bind({parentNode: parentNode, comp: this}));
}
Nach oben Traversal abgeschlossen ist, möchte ich myServerCall
Funktion aufrufen, die ein asynchrones Ajax-Anfrage beinhalten wird und es zu Abschluss dieses Asynchron-Anfrage, endlich möchte ich eine dritte Funktion aufrufen myFinalFunc
.
Derzeit verwende ich folgenden Code, um diesen Traversal-Code zu machen ausführen:
const TreeModel = require('tree-model');
const _treeModel = new TreeModel();
let _bcRoot = _treeModel.parse({
id: "0",
href: null,
text: "",
element: $(".main-menu").get(0)
});
_traverseNodeChildren.apply(this, ["> li > a[data-bc-id]",
_bcRoot, myServerCall, myFinalFunc]);
Aber ich mag es drossel Versprechen basierter Ansatz umgesetzt werden, um mehr Kontrolle über sie zu bekommen.
Im Folgenden finden Sie den Code, ich mag es will am Ende sein:
_traverseNodeChildren.apply(this, ["> li > a[data-bc-id]", _bcRoot])
.then(function() {
return myServerCall();
})
.then(function() {
return myFinalFunc();
})
.catch(function(error) {
});
Wie kann ich dies mit drossel tun?
Was ist 'callback1', was ist' callback2'? Warum verwenden Sie 'setTimeout' in' _traverseNodeChildren' überhaupt, scheint es nichts Asynchrones zu tun? – Bergi
Warum all diese 'apply' Anrufe? Sind Ihre Zielinstanzen nicht die entsprechenden Methoden? – Bergi
@bergi Dies ist in der Tat eine Art Pseudo-Code. Bezüglich callback1 n callback2 hast du meine ganze Frage gelesen? Dies sind 'myServerCall' und' myFinalFunc'. Und diese beiden Funktionen werden async sein –