JavaScript承诺不等待异步调用

JavaScript承诺不等待异步调用,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我正在使用JavaScript承诺,但对它们来说有些陌生,并且有一些问题。在todoService.ADDTODESCRIPTION下面的代码中;是对服务器的异步调用。但是,代码不会等待todoService.ADDTODESCRiption;,并继续执行代码,这意味着test始终等于null。我之所以使用承诺,是因为我认为这有助于处理异步调用,是因为我根本不理解这个概念,还是只是在语法上做了一些错误的事情 let promise = new Promise(function (resolve,

我正在使用JavaScript承诺,但对它们来说有些陌生,并且有一些问题。在todoService.ADDTODESCRIPTION下面的代码中;是对服务器的异步调用。但是,代码不会等待todoService.ADDTODESCRiption;,并继续执行代码,这意味着test始终等于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;
        });
如果测试是一种承诺,那么如果测试不是正确的处理方法。此外,当addTodo已经提供了承诺时,您不应该创建新的承诺

您所需要的就是:

todoService.addTodo(description).then(function(result) {
    console.log(result);
}, function(err) {
    alert(err);
});
既然您在问题中还添加了addToDo的实现,那么结果是它没有返回您在那里创建的承诺,所以它只是返回了未定义的,这显然不是承诺。在此处添加退货:

请注意,其他返回语句位于异步执行的相对回调函数中,因此它们不为addToDo提供返回值,而是为promise提供解析值

注意:由于您在addToDo中处理拒绝情况,并且不级联错误,只返回null,因此addToDo在这种情况下并不表示拒绝的承诺,而是表示已履行的承诺。在这种情况下,如果您希望让addToDo的调用者获得一个被拒绝的承诺,那么只需从addToDo中删除拒绝处理程序函数。

如果test是一个承诺,那么如果test不是处理它的正确方法。此外,当addTodo已经提供了承诺时,您不应该创建新的承诺

您所需要的就是:

todoService.addTodo(description).then(function(result) {
    console.log(result);
}, function(err) {
    alert(err);
});
既然您在问题中还添加了addToDo的实现,那么结果是它没有返回您在那里创建的承诺,所以它只是返回了未定义的,这显然不是承诺。在此处添加退货:

请注意,其他返回语句位于异步执行的相对回调函数中,因此它们不为addToDo提供返回值,而是为promise提供解析值


注意:由于您在addToDo中处理拒绝情况,并且不级联错误,只返回null,因此addToDo在这种情况下并不表示拒绝的承诺,而是表示已履行的承诺。如果您希望addToDo的调用方在这种情况下获得被拒绝的承诺,那么只需从addToDo中删除拒绝处理程序函数。

除非todoService.AddToCodeScript返回承诺,否则无法停止对其执行。您应该使用todoService.ADDTODESCRIPTIONIS toolService.addToDo中标记为异步的承诺?还是承诺?在第一种情况下,将内部函数标记为async并等待todo服务是一种方法,而在另一种情况下,返回todoService.ADDTODESCRIPTION并使用then链将是一种方法,如果您不理解这个概念,那么这将是一种方法。我建议你先读一读,看看一旦你有了更清楚的了解,你是否能自己解决这个问题。MDN通常是一个很好的起点:-如果之后您仍然有问题,我们可以从那里开始。@DovBenyominSohacheski我添加了addTodo的实现,以便您可以看到它。它本身实际上实现了一个承诺。避免,只需从addTodo返回承诺链!除非todoService.ADDTODESCRIPTION返回承诺,否则无法停止对其执行。您应该使用todoService.ADDTODESCRIPTIONIS toolService.addToDo中标记为异步的承诺?还是承诺?在第一种情况下,将内部函数标记为async并等待todo服务是一种方法,而在另一种情况下,返回todoService.ADDTODESCRIPTION并使用then链将是一种方法,如果您不理解这个概念,那么这将是一种方法。我建议你先读一读,看看一旦你有了更清楚的了解,你是否能自己解决这个问题。MDN通常是一个很好的起点:-如果之后您仍然有问题,我们可以从那里开始。@DovBenyominSohacheski我添加了addTodo的实现,以便您可以看到它。它本身实际上实现了一个承诺。避免,只需从addTodo返回承诺链!非常感谢你的帮助。你说的有道理,但我还是有点困惑。据我所知,在承诺中,你必须指定一个解决方案并拒绝。如果serv.todoResource.save.$promise是一个promise对象,那么这是否意味着它已经实现了解析和拒绝?如果是这种情况,我是否应该返回serv.todoResource.save.$promise而不是serv.todoResource.save.$promise.thenfunction{…};?第一:yes save.$promise返回一个promise对象,因此不需要执行解析或拒绝:您只需要在需要从头合成一个promise时才需要它。无论您是按原样返回$PROMITE,还是添加tha
这取决于你。显然,在$promise解决后,您希望做一些事情,因此您添加了一个then来完成此操作。但这也会带来一个承诺,所以你还是可以接受的。这就是连锁承诺的力量:你不断地从一家连锁店得到承诺。非常感谢你的帮助。你说的有道理,但我还是有点困惑。据我所知,在承诺中,你必须指定一个解决方案并拒绝。如果serv.todoResource.save.$promise是一个promise对象,那么这是否意味着它已经实现了解析和拒绝?如果是这种情况,我是否应该返回serv.todoResource.save.$promise而不是serv.todoResource.save.$promise.thenfunction{…};?第一:yes save.$promise返回一个promise对象,因此不需要执行解析或拒绝:您只需要在需要从头合成一个promise时才需要它。无论您是按原样返回$PROMITE,还是添加,这取决于您。显然,在$promise解决后,您希望做一些事情,因此您添加了一个then来完成此操作。但这也会带来一个承诺,所以你还是可以接受的。这就是连锁承诺的力量:你不断地从一个连锁店得到一个承诺。