我一直试图弄清楚过去两天的承诺,到目前为止我得到了这个。任何指导方向都会很棒,因为我觉得我很困惑自己。
所以这是我的服务,它必须在服务器更新的图像捕获后按照超时顺序运行:
def pattendance
params[:a_ids] ||= []
...
end
},
它到处都是......
P.S。我以建筑为生。
答案 0 :(得分:2)
首先,@ sjokkogutten的答案是要找到的方法。将您的业务逻辑尽可能高(例如,在服务中)使应用程序更易于维护和测试。
请不要使用$http.get(...).then(onSuccess).except(onError)
的第二个参数,因为它不可链接。
then
是一个更好的模式。
当你链接承诺时,每个$http.get(...)
.then(function (result) {
return 'getCameraDirectory'; // Or $q.resolve('getCameraDirective'), doesn't matter
})
.then(function (result2) {
// result2 is 'getCameraDirectory'
});
回调都会收到前一个承诺。
undefined
使用promises时,始终返回一些内容非常重要!很容易忘记一次退货,您的承诺链最终将解析为saveMedia()
。
您的示例链接了一些方法,但这些方法不会返回任何内容。这意味着下一个链式回调不接收参数。最后,undefined
没有返回任何内容,因此整个承诺链解析为then
。
请注意,整个示例中只有一个return语句。
假设在你的一个回调中你想根据条件打破链。
你需要拒绝承诺。所有直接链接的$http.get(...)
.then(function (result) {
if (result.length > 0) {
return result;
} else {
return $q.reject('result is empty'); // or throwing error
}
})
.then(function (result2) {
// result2 is non empty!
})
.catch(function (message) {
// this callback is called when result is empty OR when the $http.get call rejects (eg. returns 404)
// Return something if you want to chain further
return 'Back on track';
})
.then(function (result3) {
// result3 === 'Back on track'
// This callback is only called when coming from `except`
})
.catch(function (message2) {
// This callback is called when previous 'except' or 'then' is rejecting
});
都不再被调用。
Array.forEach
答案 1 :(得分:1)
$http
已经返回了一个承诺,因此在调用服务时无需使用$q.defer()
。相反,我建议将所有$http
请求放在单独的服务/服务中:
app.factory('DataService', function($http, $cordovaFileTransfer) {
var getCameraDirectory = function() {
return $http.json("/api/...") // returns a promise
};
var setCameraMode= function() {
return $http.json("/api/...")
};
var getCameraDirectory = function() {
return $http.json("/api/...")
};
var captureMedia = function() {
return $http.json("/api/...")
};
var saveMedia = function() {
return $cordovaFileTransfer.download(url, targetPath, options, trustHosts) // I am not sure, but I am assuming that $cordovaFileTransfer.download() is returning a promise.
};
return {
getCameraDirectory: getCameraDirectory,
setCameraMode: setCameraMode,
captureMedia: captureMedia,
saveMedia: saveMedia
}
});
在您的控制器中,您现在可以使用then
myApp.controller('MyController', function ($scope, DataService) {
DataService.getCameraDirectory().then(
function(){ //resolve getCameraDirectory
// getCameraDirectory successcallback
},
function(){
// getCameraDirectory errorcallback
}).then( // resolve setCameraMode
function(){
// setCameraMode successcallback
},
function(){
// setCameraMode errorcallback
}).then( // resolve captureMedia
function(){
// captureMedia successcallback
},
function(){
// captureMedia errorcallback
}).then(// resolve saveMedia
function(){
// saveMedia successcallback
},
function(){
// saveMedia errorcallback
})
});
请注意,我实际上没有实现上面的代码,但应该为您提供一个大纲。