我正在使用JavaScript承诺,但对他们来说有些新问题并且有一些问题。在下面的代码“todoService.addTodo(description);”是对服务器的异步调用。但是,代码不等待“todoService.addTodo(description);”完成,而是继续执行代码,这意味着“test”总是等于null。我正在使用promises,因为我认为这有助于处理异步调用,我是不是只是不理解这个概念,或者只是在语法上做错了什么?
let promise = new Promise(function (resolve, reject){
let test = todoService.addTodo(description);
console.log(test)
if (test) {
console.log("GOOD");
resolve("OK");
} else {
console.log("BAD");
reject("Unable to connect to server");
}
});
promise.then(function(result) {
console.log(result);
}, function(err) {
alert(err);
});
这是addTodo()的实现:
addTodo: function (description) {
serv.todoUrl ='http://localhost:8080/add?description=' + description;
serv.todoResource = $resource(serv.todoUrl);
serv.todoResource.save().$promise.then(function (data) {
console.log(data);
let toReturn = {result: data.result, details: data.details};
console.log(toReturn);
return toReturn;
}, function (error) {
return null;
});
答案 0 :(得分:4)
如果test
是承诺,则if (test)
不是处理它的正确方法。更重要的是,当new Promise
已经提供承诺时,您不应该创建addTodo
。
您只需要这样:
todoService.addTodo(description).then(function(result) {
console.log(result);
}, function(err) {
alert(err);
});
现在你在问题中添加了addToDo
的实现,但事实证明它缺少你在那里创建的承诺的return
,所以它只返回了undefined
,显然不是一个承诺。在此处添加return
:
addTodo: function (description) {
serv.todoUrl ='http://localhost:8080/add?description=' + description;
serv.todoResource = $resource(serv.todoUrl);
return serv.todoResource.save().$promise.then(function (data) {
// ^^^^^
console.log(data);
let toReturn = {result: data.result, details: data.details};
console.log(toReturn);
return toReturn;
}, function (error) {
return null;
});
请注意,其他return
语句位于异步执行的相对回调函数中,因此它们不提供addToDo
的返回值,但它们为promise提供了解析值
注意:由于您在addToDo
中处理拒绝案例并且没有级联错误,但只返回null
,addToDo
在这种情况下不代表被拒绝的承诺,但是一个满足的。如果您希望调用者addToDo
在这种情况下获得被拒绝的承诺,那么只需从addToDo
中删除拒绝处理函数。