我有一个JavaScript类,旨在帮助处理承诺。首先,您将函数添加到数组,然后执行它们弹出它们并调用自己来执行下一个。在数组的末尾,它解决了这个承诺。我希望然后将解决方案一直传播到递归调用的堆栈中。这将允许您使用一组简单的命令强制执行多个异步函数。此外,还采用逻辑来修改ansync函数的流程。
[RoutePrefix("api/produceusage")]
public class ProduceUsageController : ApiController
{
[Route("{unit}/{begindate}/{enddate}")]
public HttpResponseMessage Get(string unit, string beginRange, string
endRange)
{
. . .
[Route("{unit}/{begindate}/{enddate}")]
[HttpPost]
public void Post(string unit, string begindate, string enddate)
{
. . .
我收到了ReferenceError:'executeAll'未定义 在这个脚本中,在splice
之后的递归调用行“executeAll”上正在执行数组中的第一个函数(我正在使用模式弹出窗口进行测试),当它解析时会触发拼接,然后它会在executeAll行上抛出错误。我是否错误地定义了该功能?我是否正确地将其称为递归函数?
答案 0 :(得分:1)
使用this.executeAll
- 假设this
是正确的,它不会,所以你也需要考虑到这一点......像executeAll顶部的var self = this
之类的东西,然后拨打self.executeAll
this.executeAll = function() {
var functionList = this.functionSequence;
var deferred = $q.defer();
var self = this; // save reference to this
if (functionList.length > 0) {
functionList[0]().then(function(result) {
if (result) {
functionList.splice(0, 1);
// need to use self here because "this" is not the "this" we want
self.executeAll().then(function(resultInner) {
if (resultInner == true) {
deferred.resolve(true);
} else {
deferred.resolve(false);
}
});
} else {
functionList = [];
deferred.resolve(false);
}
});
} else {
deferred.resolve(true);
}
return deferred.promise;
};
this
不是您想要的this
的原因是由于this
在javascript中的工作原理 - 有关使用this
的堆栈交换信息很多 - 我会很快找到并链接一个好的答案
我提供此替代代码
this.executeAll = function() {
return this.functionSequence.reduce(function(promise, item) {
return promise.then(function(result) {
if (result) {
return item();
}
else {
throw "Fail"; // throw so we stop the chain
}
});
}, Promise.resolve(true))
.then(function(result) {
this.functionSequence = []; // clear out the added functions
return true; // fulfilled value is true as per original code
}.bind(this), function(err) {
this.functionSequence = []; // clear out the added functions
if (err == "Fail") {
return false; // convert the "Fail" to a fullfilled value of false as per original code
}
else {
throw err; // any other error - re-throw the error
}
}.bind(this))
};