我正在使用JavaScript的Promise,但是对它们来说有些新意,并且有一些问题。在下面的代码“ todoService.addTodo(description);”中是对服务器的异步调用。但是,代码不会等待“ todoService.addTodo(description);”。完成,而是继续执行代码,这意味着“测试”始终等于null。我之所以使用诺言,是因为我认为这将有助于处理紧急呼叫,我只是在不理解这个概念,还是只是在语法上做错了什么?
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;
});
最佳答案
如果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
中删除拒绝处理程序函数。