JavaScript承诺无法等待异步调用

时间:2018-06-09 19:12:45

标签: javascript asynchronous promise

我正在使用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;
        });

1 个答案:

答案 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中处理拒绝案例并且没有级联错误,但只返回nulladdToDo在这种情况下不代表被拒绝的承诺,但是一个满足的。如果您希望调用者addToDo在这种情况下获得被拒绝的承诺,那么只需从addToDo中删除拒绝处理函数。