简体   繁体   中英

How to do a synchronous call with jaydata

I'm a bit confused about the asynchous call to the DataBase.

I just want to have a javasctipt adapter class for the calls to the web sql. But I'm not quite sure how to do this. Propably somebody have a good hint for me.

The function OfflneAppDBAdapter.prototype.IsDeviceConfigured() should return true or false depending if there are any items in the Table DeviceConfig.

function OfflneAppDBAdapter() {
self = this;
this.deviceIsConfigured = false;

this.Init = function () {

    $data.Entity.extend("$de.offlineapp.DeviceConfig", {
        Id: { type: "int", key: true, computed: true },
        Name: { type: "string", required: true },
        Token: { type: "string" },
        Type: { type: "string" }
    });


    $data.EntityContext.extend("$de.offlineapp.DataContext", {
        DeviceConfig: { type: $data.EntitySet, elementType: $de.offlineapp.DeviceConfig }
    });

}
self.Init();

$de.offlineapp.context = new $de.offlineapp.DataContext({
    name: "webSql", databaseName: "OfflineApp"
});

$de.offlineapp.context.onReady(function () {

});

}

// ************************************************************************ 
// PUBLIC METHODS -- ANYONE MAY READ/WRITE 
// ************************************************************************ 
OfflneAppDBAdapter.prototype.AddDeviceConfig = function (deviceName, deviceToken, deviceTyp) {
$de.offlineapp.context.onReady(function () {
    var promise = $de.offlineapp.context.DeviceConfig.toArray(function (x) {
        if (x.length == 0) {
            var emp = new $de.offlineapp.DeviceConfig({ Name: deviceName, Token: deviceToken, Type: deviceTyp });
            $de.offlineapp.context.DeviceConfig.add(emp);
            $de.offlineapp.context.saveChanges();
        }
    }
)
});

}

OfflneAppDBAdapter.prototype.IsDeviceConfigured = function () {

$de.offlineapp.context.onReady(function () {
    var promise = $de.offlineapp.context.DeviceConfig.toArray(function (x) {
        if (x.length == 0) {
            this.deviceIsConfigured = true;
        }
    }
)
});

return this.deviceIsConfigured;
} 


var myOfflineAppDBAdapter = new OfflneAppDBAdapter();
myOfflineAppDBAdapter.AddDeviceConfig("DeviceName", "Token", "iPad");
console.log(myOfflineAppDBAdapter.IsDeviceConfigured());

As expected the console prints "false". I' aware that the jaydata call works with callbacks and the callbacks are not part of the main class. But there must be a possibility to do so?

I would really apprechiate any help.

Thank you in advance.... Chris

UPDATE: As you requested the startup code:

function OfflineApplication()
    {
        self = this;
    }


    OfflineApplication.prototype.StartApplication = function () {

        //Check if online, then sync and 
        if (navigator && navigator.onLine === true) {
            this.IsDeviceConfigured();
        }
        else {

        }


    }

    ///check if the device has a base configuration
    OfflineApplication.prototype.IsDeviceConfigured = function () {

        myOfflineAppDBAdapter.GetDeviceConfiguration(function (result) {
            if (result.length > 0) {
                myOfflineAppDBAdapter.deviceIsConfigured = true;
                myOfflineApplication.HasDeviceAnApplication();
            }
            else {
                ///Get the device base conf from the server.
                myOfflineAppSynchronisationAdapter.getDeviceConfigurationByToken(token, myOfflineApplication.HasDeviceAnApplication);
                myOfflineAppDBAdapter.deviceIsConfigured = true;
            }
        });
    }
    ///check if the device has an "application config" in general 
    OfflineApplication.prototype.HasDeviceAnApplication = function () {
        myOfflineAppDBAdapter.GetDeviceAnApplication(function (result) {
            if (result.length > 0) {
                myOfflineApplication.IsDeviceApplicationVersionLatest(result);
            }
            else {
                myOfflineApplication.GetApplication(false);
            }
        });
    }

    ///the application config could differ from time to time, so we have to check if a different application should be synct with the device
    OfflineApplication.prototype.IsDeviceApplicationVersionLatest = function (result) {

        myOfflineAppDBAdapter.DeleteDeviceAnApplication(function () {  });
        console.log(result);
    }


    ///get the application from the server
    OfflineApplication.prototype.GetApplication = function (clearConfig) {
        if (clearConfig === true)
        {


        }

        myOfflineAppSynchronisationAdapter.getDeviceApplicationByToken(token, myOfflineApplication.LoadApplication);

    }


    OfflineApplication.prototype.LoadApplication = function () {
        console.log('Now everything is finde and the application gets loaded..');
    }



    var myOfflineAppDBAdapter = new OfflneAppDBAdapter();
    var myOfflineAppSynchronisationAdapter = new OfflineAppSynchronisationAdapter();
    var myOfflineApplication = new OfflineApplication();

    myOfflineApplication.StartApplication();

There is no sync way. You handling promises wrong. Make your code simple :) You'll need something like this:

$data.Entity.extend("$de.offlineapp.DeviceConfig", {
    Id: { type: "int", key: true, computed: true },
    Name: { type: "string", required: true },
    Token: { type: "string" },
    Type: { type: "string" }
});


$data.EntityContext.extend("$de.offlineapp.DataContext", {
    DeviceConfig: { type: $data.EntitySet, elementType: $de.offlineapp.DeviceConfig }
});

var context = new $de.offlineapp.DataContext({
    name: "webSql", databaseName: "OfflineApp"
});

function AddDeviceConfig(deviceName, deviceToken, deviceTyp) {
    return context.DeviceConfig.toArray()
    .then(function (x) {
        if (x.length == 0) {
            var emp = new $de.offlineapp.DeviceConfig({ Name: deviceName, Token: deviceToken, Type: deviceTyp });
            context.DeviceConfig.add(emp);
            return context.saveChanges();
        }
    })
}

function IsDeviceConfigured() {
    return context.DeviceConfig.toArray()
    .then(function (x) {
        return x.length > 0;
    })
}

context.onReady()
.then(IsDeviceConfigured)
.then(console.log)
.then(function() { return AddDeviceConfig("DeviceName", "Token", "iPad"); })
.then(IsDeviceConfigured)
.then(console.log);

here's a fiddle which does this: http://jsfiddle.net/JayData/cpT5q/1/

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM