Обещание JavaScript не ожидает асинхронного вызова - PullRequest
0 голосов
/ 09 июня 2018

Я работаю с обещаниями JavaScript, но я немного новичок в них и имею некоторые проблемы.В приведенном ниже коде "todoService.addTodo (description);"это асинхронный вызов к серверуТем не менее, код не ожидает "todoService.addTodo (description);"чтобы закончить, и вместо этого продолжает выполнение кода, что означает, что «тест» всегда равен нулю.Я использую обещания, потому что я думал, что это поможет справиться с асинхронными вызовами, я просто не понимаю концепцию или просто делаю что-то неправильно синтаксически?

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 голосов
/ 09 июня 2018

Если 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, но они предоставляютразрешающее значение для обещания.

Примечание: поскольку вы обрабатываете случай отклонения в addToDo и не каскадируете ошибку, а просто возвращаете null, addToDo не будет представлять отклоненное обещание вэто дело, но уже выполненное.Если вы предпочитаете, чтобы в этом случае получатель отклонял обещание addToDo, просто удалите функцию обработчика отклонения из addToDo.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...