Promises in Appcelerator Alloy Cloud Services Adapter integrieren

Schneller Überblick

Wir alle haben uns daran gewöhnt, Versprechungen zu verwenden, um die Callback-Hölle zu vermeiden, also haben wir hier ein Beispiel für eine ACS-Adapter das unterstützt Versprechungen mit der $q JavaScript-Bibliothek.

Zuerst erstellen Sie Ihre Alloy Appcelerator Cloud Services-Modelle, indem Sie die in beschriebenen Schritte befolgen Dokumentation des Appcelerator-Legierungsmodells

Wenn Sie fertig sind, sieht ein Objekt so ähnlich aus; Beachten Sie, wie wir die ACS-Klasse und den Namen der zugehörigen Sammlung so definiert haben, dass sie mit der Klasse übereinstimmen. Dies ist wichtig, da der ACS-Synchronisierungsadapter auf diese Weise den geeigneten REST-API-Aufruf für die Interaktion mit dem Dienst erstellen kann

exports.definition = {
    config : {
        "columns" : {},
        "defaults" : {},
        "adapter" : {
            "type" : "acs",
        },
        "settings" : {
            "object_name" : "photos", // <- match the ACS Object
            "object_method" : "Photos"
        }
    },

    extendModel : function(Model) {
        _.extend(Model.prototype, {});
        return Model;
    },

    extendCollection : function(Collection) {
        _.extend(Collection.prototype, {});
        return Collection;
    }
}

Für benutzerdefinierte Objekte können wir sie unterstützen, indem wir den Namen des benutzerdefinierten Objekts in der Konfigurationseinstellungseigenschaft angeben und dann die object_method festlegen. Siehe Beispiel eines benutzerdefinierten Objekts namens book

exports.definition = {
    config : {
    "columns": {},
    "defaults": {},
    "adapter": {
        "type": "acs",
    },
    "settings": {
        "object_name": "book",
        "object_method": "Objects" //<--indicates a Custom ACS object
       }
    },

    extendModel : function(Model) {
        _.extend(Model.prototype, {});
        return Model;
    },

    extendCollection : function(Collection) {
        _.extend(Collection.prototype, {});
        return Collection;
    }
}

Jetzt können Sie also Ihr benutzerdefiniertes Objekt wie folgt abfragen

/**
* gets books and returns a promise
*/
function getBooks() {
    var books = Alloy.createCollection('Book');
    return books.fetch();
}

// need a user object to login with
var aUser = Alloy.createModel('User');

// notice the call to the extended function with no success or error
// callbacks, they are handled by the promise structure
aUser.login("testuserone", "password").then(function(_response) {
    // successful login here!!
    Ti.API.info(' Success:Login, with Promise\n ' + JSON.stringify(_response, null, 2));

    // now query for the books and the success will be handled by 
    // the next `then` function below, else it falls thru to the 
    // error 
    return getBooks(); //&lt;-- returns a promise also!
}).then(function(_bookResp) {
    // here we handle the successful book query
    Ti.API.info(' Success:Books, with Promise\n ' + JSON.stringify(_bookResp, null, 2));
}, function(_error) {
    // ANY errors is the promise chain will fall thru to here
    Ti.API.error(' ERROR ' + JSON.stringify(_error));
});

Dieser Ansatz ist VIEL sauberer als der alte Callback-Ansatz, probieren Sie es aus … der Adapter unterstützt immer noch beide Ansätze.

Zusätzliche Änderungen, die erforderlich sind, damit die Anwendung ordnungsgemäß funktioniert

  • Sie müssen die enthalten $q JavaScript-Bibliothek in Ihrem Projekt. Ich schlage vor, Sie erstellen eine lib Ordner im app Verzeichnis und fügen Sie die Datei dort hinzu.
  • Du fügst die hinzu alloy\sync\acs.js Datei an die lib Achten Sie auch darauf, den vollständigen Ordnerpfad zu erstellen.
  • Sie müssen Ihre aktualisieren alloy.js Datei zur Unterstützung der Modelle und Sammlungen, die das Versprechen vom Synchronisierungsadapter zurückgeben, siehe line 10 und line 36 wo wir das Ergebnis vom Sync-Adapter zurückgeben.

Die neuen Änderungen an alloy.jsfügen Sie die folgenden Zeilen zur Datei hinzu

Alloy.C = function(name, modelDesc, model) {
  var extendObj = {
    model : model
  };
  var config = ( model ? model.prototype.config : {}) || {};
  var mod;
  if (config.adapter && config.adapter.type) {
    mod = require("alloy/sync/" + config.adapter.type);
    extendObj.sync = function(method, model, opts) {
      return mod.sync(method, model, opts);
    };
  } else
    extendObj.sync = function(method, model) {
      Ti.API.warn("Execution of " + method + "#sync() function on a collection that does not support persistence");
      Ti.API.warn("model: " + JSON.stringify(model.toJSON()));
    };
  var Collection = Backbone.Collection.extend(extendObj);
  Collection.prototype.config = config;
  _.isFunction(modelDesc.extendCollection) && ( Collection = modelDesc.extendCollection(Collection) || Collection);
  mod && _.isFunction(mod.afterCollectionCreate) && mod.afterCollectionCreate(Collection);
  return Collection;
};

Alloy.M = function(name, modelDesc, migrations) {
  var config = (modelDesc || {}).config || {};
  var adapter = config.adapter || {};
  var extendObj = {};
  var extendClass = {};
  var mod;
  if (adapter.type) {
    mod = require("alloy/sync/" + adapter.type);
    extendObj.sync = function(method, model, opts) {
      return mod.sync(method, model, opts);
    };
  } else
    extendObj.sync = function(method, model) {
      Ti.API.warn("Execution of " + method + "#sync() function on a model that does not support persistence");
      Ti.API.warn("model: " + JSON.stringify(model.toJSON()));
    };
  extendObj.defaults = config.defaults;
  migrations && (extendClass.migrations = migrations);
  mod && _.isFunction(mod.beforeModelCreate) && ( config = mod.beforeModelCreate(config, name) || config);
  var Model = Backbone.Model.extend(extendObj, extendClass);
  Model.prototype.config = config;
  _.isFunction(modelDesc.extendModel) && ( Model = modelDesc.extendModel(Model) || Model);
  mod && _.isFunction(mod.afterModelCreate) &amp;&amp; mod.afterModelCreate(Model, name);
  return Model;
};

Neuestes Video aus der Serie

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *