为什么我在承诺时调用.then会出现此错误?
vm.submitPromise(...)。然后不是函数
我的代码的简化版本是:
var submitPromise = function($q) {
return function() {
var deferred = $q.defer();
//$scope.ngSubmitFunction();
// simulated async function
$timeout(function() {
deferred.resolve('data received!')
}, 2000);
return deferred.promise;
}
}
function ngSubmit($form) {
vm.submitDisabled = true;
submitPromise().then(function() {
vm.submitDisabled = false;
});
};
这是管理表格的指令的一部分。目的是让Submit按钮调用可能有一个或多个异步调用的函数,我需要等待它们再次启用再次启用提交按钮。
几乎我读到的任何地方都会发生这种情况,当函数没有返回一个承诺时,但我的确如此(我相信)。不是吗?我错过了什么我正在尝试使用模拟异步函数$ timeout和.resolve进行调试(可以在代码中看到),但是我得到了同样的错误。
答案 0 :(得分:2)
submitPromise
正在返回一个函数,该函数又返回一个promise,但是你没有调用该函数。鉴于该方法的签名,您需要像这样使用它:
function ngSubmit($form) {
vm.submitDisabled = true
submitPromise()().then(function () {
vm.submitDsabled = false
})
}
您可能想要这样做:
var submitPromise = function($q) {
var deferred = $q.defer();
//$scope.ngSubmitFunction();
// simulated async function
$timeout(function() {
deferred.resolve('data received!')
}, 2000);
return deferred.promise;
}
请注意,不推荐使用延迟模式,$q
(以及浏览器中的本机Promise
实现)建议使用基于构造函数的模式:
function submitPromise($q) {
return $q(function (resolve) {
$timeout(function() {
resolve()
}, 2000)
})
}
这样做的原因主要是因为您使用$q
符合ES6规范,也意味着您不必强制管理承诺本身(这可能导致创作错误)。
答案 1 :(得分:0)
您正在返回一个函数,您需要返回一个承诺。
var submitPromise = function($q) {
var deferred = $q.defer();
// simulated async function
$timeout(function() {
deferred.resolve('data received!')
}, 2000);
return deferred.promise;
}
OR ,您需要调用返回的函数,如
function ngSubmit($form) {
vm.submitDisabled = true
submitPromise()().then(function () {
vm.submitDsabled = false
})
}
答案 2 :(得分:0)
submitPromise
返回一个函数。因此,你需要执行它
尝试以下
function ngSubmit($form) {
vm.submitDisabled = true;
submitPromise()().then(function() {
vm.submitDisabled = false;
});
};
答案 3 :(得分:0)
不是你的问题 - 你的函数只返回函数而不是promise但是......
var submitPromise = function(){
return $timeout(function(){
return data;
}, 2000);
};
这是编写示例的正确方法