2013-08-21 2 views
0

Я немного смущен об асинхронном обращении к базе данных.Как сделать синхронный вызов с помощью jaydata

Я просто хочу иметь класс адаптера javasctipt для вызовов в веб-sql. Но я не совсем уверен, как это сделать. Уместно, у кого-то есть хороший намек для меня.

Функция OfflneAppDBAdapter.prototype.IsDeviceConfigured() должна возвращать значение true или false в зависимости от наличия элементов в таблице 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()); 

Как и ожидалось, консоль печатает «ложь». Я знаю, что вызов jaydata работает с обратными вызовами, а обратные вызовы не являются частью основного класса. Но должна ли быть возможность сделать это?

Я бы действительно воспринял любую помощь.

Спасибо заранее .... Крис

UPDATE: Как вы запросили код запуска:

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(); 

ответ

1

Там нет синхронизации путь. Вы неправильно выполняете обещания. Сделайте ваш код просто :) Вам нужно что-то вроде этого:

$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); 

вот скрипку, которая делает это: http://jsfiddle.net/JayData/cpT5q/1/

+0

Большое спасибо за ваше решение. Действительно, это работает ... Но, как вы, наверное, уже разобрались, я пришел из C#. Поэтому я хочу разделить разные задачи в разных классах. Я нашел другое решение, довольно сложное в моих глазах, с очень большим количеством обратных вызовов ...;) Мне нужно выполнить различные проверки базы данных, потому что я должен синхронизировать с сервером большое количество данных. Но это зависит от локальных версий хранилища. Итак, у меня есть куча, если бы другие заявления в Startup были бы лучшим способом ... Теперь я делаю CallBack-Chaining ... Или у вас есть идея лучше? – user2704153

+0

Показать код, я не могу помочь без него –

+0

Я поместил код в раздел «Обновление» ... – user2704153