Как получить обещание, которое уже разрешено? - программирование
Подтвердить что ты не робот

Как получить обещание, которое уже разрешено?

У меня есть обещание, которое я связываю в своем пользовательском интерфейсе. Когда обещание будет устранено, и элемент элементов пользовательского интерфейса я могу затем щелкнуть на этом элементе пользовательского интерфейса. В моем контрольном коде, где я обрабатываю щелчок, я хотел бы действовать по значению обещания. На данный момент в моем angular кодексе я уже знаю, что обещание разрешено. Но когда я хочу получить значение, это все еще обещание.

Какой лучший способ получить ценность обещания... учитывая, что я знаю, что он должен был решить?

4b9b3361

Ответ 1

Promises всегда promises - и как они должны быть. Хотя можно связать обещание напрямую с представлением, я вообще отговариваю эту практику, потому что она не обладает прозрачностью и может привести к мерцанию зрения. Лучшим решением является назначение значения области в вызове then:

myService.then(function( val ) {
  $scope.val = val;
});

Когда $scope.val готов, его всегда можно рассматривать непосредственно как значение - потому что оно есть.

Тем не менее, если вы хотите напрямую выполнить назначение обещаний, вам просто нужно рассматривать это как обещание; то есть вы должны вызвать promise.then(function () { ... });. Это кажется неудобством, но на самом деле это залог того, насколько мощными являются promises.

Если вам нужна дополнительная информация о promises, я ознакомился с ними (и привел примеры кода) для недавнего видеовстречи Google+, где я рассмотрел преимущества, общие применения и лучшие практики promises в AngularJS: AngularJS Hangout - promises, Promises Обещания, Promises. Идея бесконечных цепочек обещаний была специально решена, хотя у меня нет таймкода с головы.

Надеюсь, это поможет!

Ответ 2

Что сложно понять, так это то, что вы можете подумать, что если обещание еще не заполнено, то, может быть, если я немного подожду, я смогу снова проверить его, если теперь оно имеет значение. Но это невозможно, потому что, как объяснено в MDN:

"Обратные вызовы никогда не будут вызываться до завершения текущего цикла цикла JavaScript".

Таким образом, пока ваша текущая функция запускается, Promise не может быть заполнен полностью. Он не имеет "значения" во время текущего цикла события. "Обещание" означает "Я обещаю, возможно, дать его вам во время выполнения цикла NEXT".

Вы можете сэкономить это обещание для глобальной переменной, а затем, когда пользователь нажимает кнопку в браузере, новый цикл событий начинается с запуска вашего обработчика событий, который может поместить другое "когда()" на обещание так, чтобы если обещание будет разрешено к тому времени, новая функция if примет значение, которое оно получает как аргумент, и сохраняет его в переменную, из которой вы можете ее прочитать. Не нужно писать на консоль, чтобы увидеть, что она есть.

Для меня была сложная часть, я подумал, что да, конечно, я могу заставить Promise писать на консоль, но я не могу читать с консоли, так как я могу получить эту ценность в остальной части моей программы? Ответ: Подождите, пока текущий цикл событий закончится, тогда вы сможете.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises