@pqgg7nwkd4

Как отложить выполнение обещания (promise)?

Добрый день.

Есть какой-нибудь общепринятый или стандартный способ делать обещания, которые не выполняются сразу?

Например:
var promise = new Promise(function (ok, fail) {
   console.log('1');
   ok();
});
// Здесь функция обещания уже выполнена.
console.log('2');
promise.then(function () {
	console.log('3');
});

Результат выполнения этого кода: 1 2 3.

А суть моего желания заключается в чем-то таком (DeferredPromise - вымышленный желаемый класс):
var promise = new DeferredPromise(function (ok, fail) {
   console.log('1');
   ok();
});
// Здесь функция обещания  еще не выполнена.
console.log('2');
promise.then(function () {
	console.log('3');
});
promise.doIt();

Результат выполнения этого кода: 2 1 3.
  • Вопрос задан
  • 269 просмотров
Пригласить эксперта
Ответы на вопрос 3
@vshvydky
function promise() {
return new Promise(function (ok, fail) {
   console.log('1');
   ok();
});
}
// Здесь функция обещания уже выполнена.
console.log('2');
promise().then(function () {
  console.log('3');
});
//2
//1
//3
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Можно «разорвать тред», обернув в setTimeout( ()=>{...}, 0):

var promise = new Promise( function (ok, fail) {
  setTimeout( function() {
    console.log('1');
    ok();
  }, 0);
});
// Здесь функция обещания ещё не выполнена.
console.log('2');
promise.then(function () {
  console.log('3');
});
// 2 1 3


Promise, не содержащий в себе асинхронного вызова, синхронно возвращает значение. То же самое, как:var promise = Promise.resolve( value);
Ответ написан
bingo347
@bingo347 Куратор тега JavaScript
Crazy on performance...
function doLater(cb) {
  const d = {resolve: null, reject: null};
  const promise = new Promise((resolve, reject) => {
    d.resolve = resolve;
    d.reject = reject;
  });
  function run() {
    try {
      cb(d.resolve, d.reject);
    } catch(e) {
      Promise.reject(e).catch(d.reject);
    }
  }
  return {run, promise};
}

//example:
const d = doLater(ok => {
  console.log('1');
  ok();
});
console.log('2');
d.promise.then(() => {
  console.log('3');
});
d.run();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы