正如其他一些答案中提到的,您需要從utils.getData
函數中返回Promise
。 Angular的$q
助手可以讓你做到這一點。但是,其他一些答案顯示您這樣做的方式違背了最佳做法。當使用$q
,最好的做法是要做到以下幾點:
var myPromise = $q(function (resolve, reject) {
// Do some logic in here that is asynchronous and either invoke resolve with
// the results or reject with an error that may have occurred
});
因此,你的代碼就變成了:
angular.module('newApp.utility', [])
.factory('utilityFactory', function($q, $http) {
var utils = {};
//This is a cordova plugin
var getLauncher = function() {
return window.plugin.launcher;
};
var success = function(data) {
console.log(device);
return device;
}
var fail = function(error) {
console.log("error", error);
};
utils.getData = function() {
/* Get the store number details initially before initalizing the application */
return $q(function (resolve, reject) {
if (!window.plugin) {
// You can handle this case as a rejection of the promise
reject(new Error('Window plugin not found'));
return;
}
var launcher = getLauncher();
console.log("Fetching data from device");
//Cordova js is returning this method
// When device is ready it will "resolve" the promise and
// invoke any of the ".then()" functions you add to the promise
// If an error occurs, it will invoke any ".catch()" functions
// that you have added.
launcher.getDevice(resolve, reject);
});
};
return utils;
})
有關$q
服務的更多信息,請從官方AngularJS文檔,檢查這個職位: https://docs.angularjs.org/api/ng/service/ $ q
此外,如果您想了解更多關於承諾和JavaScript中的異步編程的一些資源:
的承諾整潔的可視化工具 - http://bevacqua.github.io/promisees/#
教程上的承諾 - https://www.toptal.com/javascript/javascript-promises
另一件事是尋找到作爲AngularJS最佳實踐的一般指導是角風格導遊約翰爸爸:https://github.com/johnpapa/angular-styleguide
最後,你有你的模塊設置的方式稍微關閉。每次調用angular.module(moduleName, dependencies)
將創建一個具有這些依賴關係的新模塊。雖然將角度應用分解爲多個模塊是一個好主意,但您需要確保使用ng-app
指令引用的根或「主」應用具有對所有子模塊的引用,並且任何引用依賴關係的模塊從另一個模塊中將該模塊包含在其依賴列表中。
在你的情況,你創建一個名爲newApp.newController
模塊,但你擁有它,因爲它試圖引用utilityFactory
,這是在所謂的newApp.utility
一個單獨的模塊定義的,但不是由你newApp.newController
模塊引用它不會工作。爲了解決這個問題,請執行下列操作:
angular.module('newApp.newController', ['angularSpinner', 'ui.bootstrap', 'newApp.utility'])
// Make sure to add 'newApp.utility' to the dependencies of the 'newApp.newController' module.
或者,你可以創建兩個控制器和同一模塊中的效用工廠:繞角模塊系統
// Create the module once
angular.module('newApp', ['angularSpinner', 'ui.bootstrap']);
// Reference it by invoking it with just one parameter
angular.module('newApp').controller('newController', ...);
angular.module('newApp').factory('utilityFactory', ...);
用法和最佳實踐能在這裏找到: https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#modules
'getData'不返回任何東西 –
我用這個也 回報launcher.getD設備(成功,失敗); – Bharath
但是它不會爲'else'返回任何東西,而'launcher.getDevice'返回什麼? – charlietfl