我正在使用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中删除​​拒绝处理程序函数。

09-18 07:42