Angular - Promise:如何同步函数
Angular - Promise: how to synchronise functions
我正在使用 angular1,我有 4 个函数需要同步执行。假设这些功能是: f1 , f2 , f3 , f4 并且需要按顺序 运行 。 f1、f2、f3、f4是其他情况下独立使用的函数。我只有一个用例需要按顺序执行它们。我知道我必须使用 promise,我试过:
self.selectionPromise = function(){
var deferred = $q.defer();
console.log("Inside promise");
self.f1();
return deferred.promise;
};
然后将其用作:
self.updateSelectedFile = function () {
self.selectionPromise()
.then(self.f2() )
.then(self.f3() )
.then(self.f4() )
}
似乎没有解决我的问题。我看到错误:**TypeError: Cannot read 属性 'then' of undefined 此外,功能不按顺序 **
我可以得到有关如何使用 expect 来同步这 4 个函数的帮助吗?
代码结构提示如下:
函数F1:
self.setRecordCount = function ()
{
var deferred = $q.defer();
if (!self.selectedFile)
{
self.recordCount = 0;
return;
}
self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};
FileService.getRecordCount(self.fileInfo)
.then(
function (count)
{
//do something
},
function (errResponse)
{
self.recordCountError = "Error while getting record count for file: " + self.folderPath + self.selectedFile;
}
)
.then(function finishUp(response)
{
console.log("returning from recordCount");
})
;
deferred.resolve("RecordCount");
deferred.promise;
}
函数 F2:
self.detectDelimiter = function () {
var deferred = $q.defer();
if (!self.selectedFile) {
return;
}
self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};
FileService.detectFileDelimiter(self.fileInfo)
.then(
function ( fileDelimiter ) {
//do something
},
function( errResponse ) {
self.displayError = "Error attempting to detect file delimiter";
}
)
.then(function finishUp(response){
console.log("returning from detectDelimeter");
})
;
deferred.resolve("Detect Delimeter");
deferred.promise;
}
现在我正在尝试同步这两个函数 F1 和 F2 并进行第三次函数调用:
self.updateSelectedFile = function ()
{
self.setRecordCount()
.then(function(){
console.log("promise done : setRecordCount")
self.detectDelimiter()
.then(function(){
console.log("promise done : detectDelimiter")
self.generateFilePreviewInfo();
})
})
}
您必须在每个函数回调上链接承诺。如果您在任何函数中有任何异步代码,请确保在内部异步代码成功回调后调用 resolve
class HomeCtrl {
constructor($scope, $q) {
'ngInject';
this.name = "AngularJS";
execute();
function execute() {
selectionPromise().then(function (data) {
f1().then(function (data) {
f2().then(function (data) {
f3().then(function (data) { });
});
});
});
}
function selectionPromise() {
var deferred = $q.defer();
console.log("Inside promise");
deferred.resolve("someData")
return deferred.promise;
};
function f1() {
var deferred = $q.defer();
console.log("Executed 1 ")
deferred.resolve("Some Data from F1")
return deferred.promise;
}
function f2() {
var deferred = $q.defer();
console.log("Executed 2 ")
deferred.resolve("Some Data from F2")
return deferred.promise;
}
function f3() {
var deferred = $q.defer();
console.log("Executed 3 ")
deferred.resolve("Some Data from F3")
return deferred.promise;
}
}
}
export default HomeCtrl;
我正在使用 angular1,我有 4 个函数需要同步执行。假设这些功能是: f1 , f2 , f3 , f4 并且需要按顺序 运行 。 f1、f2、f3、f4是其他情况下独立使用的函数。我只有一个用例需要按顺序执行它们。我知道我必须使用 promise,我试过:
self.selectionPromise = function(){
var deferred = $q.defer();
console.log("Inside promise");
self.f1();
return deferred.promise;
};
然后将其用作:
self.updateSelectedFile = function () {
self.selectionPromise()
.then(self.f2() )
.then(self.f3() )
.then(self.f4() )
}
似乎没有解决我的问题。我看到错误:**TypeError: Cannot read 属性 'then' of undefined 此外,功能不按顺序 **
我可以得到有关如何使用 expect 来同步这 4 个函数的帮助吗?
代码结构提示如下:
函数F1:
self.setRecordCount = function ()
{
var deferred = $q.defer();
if (!self.selectedFile)
{
self.recordCount = 0;
return;
}
self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};
FileService.getRecordCount(self.fileInfo)
.then(
function (count)
{
//do something
},
function (errResponse)
{
self.recordCountError = "Error while getting record count for file: " + self.folderPath + self.selectedFile;
}
)
.then(function finishUp(response)
{
console.log("returning from recordCount");
})
;
deferred.resolve("RecordCount");
deferred.promise;
}
函数 F2:
self.detectDelimiter = function () {
var deferred = $q.defer();
if (!self.selectedFile) {
return;
}
self.fileInfo = {fileLocation: self.folderPath + self.selectedFile};
FileService.detectFileDelimiter(self.fileInfo)
.then(
function ( fileDelimiter ) {
//do something
},
function( errResponse ) {
self.displayError = "Error attempting to detect file delimiter";
}
)
.then(function finishUp(response){
console.log("returning from detectDelimeter");
})
;
deferred.resolve("Detect Delimeter");
deferred.promise;
}
现在我正在尝试同步这两个函数 F1 和 F2 并进行第三次函数调用:
self.updateSelectedFile = function ()
{
self.setRecordCount()
.then(function(){
console.log("promise done : setRecordCount")
self.detectDelimiter()
.then(function(){
console.log("promise done : detectDelimiter")
self.generateFilePreviewInfo();
})
})
}
您必须在每个函数回调上链接承诺。如果您在任何函数中有任何异步代码,请确保在内部异步代码成功回调后调用 resolve
class HomeCtrl {
constructor($scope, $q) {
'ngInject';
this.name = "AngularJS";
execute();
function execute() {
selectionPromise().then(function (data) {
f1().then(function (data) {
f2().then(function (data) {
f3().then(function (data) { });
});
});
});
}
function selectionPromise() {
var deferred = $q.defer();
console.log("Inside promise");
deferred.resolve("someData")
return deferred.promise;
};
function f1() {
var deferred = $q.defer();
console.log("Executed 1 ")
deferred.resolve("Some Data from F1")
return deferred.promise;
}
function f2() {
var deferred = $q.defer();
console.log("Executed 2 ")
deferred.resolve("Some Data from F2")
return deferred.promise;
}
function f3() {
var deferred = $q.defer();
console.log("Executed 3 ")
deferred.resolve("Some Data from F3")
return deferred.promise;
}
}
}
export default HomeCtrl;