Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   как правильно в промисе использовать функции (https://javascript.ru/forum/css-html/79742-kak-pravilno-v-promise-ispolzovat-funkcii.html)

atanov 17.03.2020 14:36

как правильно в промисе использовать функции
 
Доброго времени суток,
затертый до дыр вопрос выполнить одну функцию после другой. Очевидный путь - за промис, однако вызов функции такого вида func(arg)() не работает.

let myPromise = new Promise
(
	(resolve, reject) => 
	{
		firstFunction(param)();
	  	resolve();
	}
);
myPromise.then(secondFunction(param)());


Но, secondFunction не ждёт зараза первую.

Если поставить таймаут, то всё ОК:

firstFunction(param)();
setTimeout(secondFunction(param)(), 2000);


обе функции возвращают анонимную:

function firstFunction(param)
{
	return () =>
	{
             ...
	}
}

Есть идеи как заставить работать?

Vlasenko Fedor 17.03.2020 15:03

Цитата:

Сообщение от atanov
выполнить одну функцию после другой

Promise.all

atanov 17.03.2020 15:06

А какая разница что все, что один промис? Не работает именно при использовании func(arg)()

destus 17.03.2020 15:14

atanov,
может так?
myPromise.then(secondFunction(param));

atanov 17.03.2020 15:18

destus, не, тогда вызов второй функции не сработает. Вру, срабатывает, но всё равно не ждёт.

destus 17.03.2020 15:24

myPromise.then(() => secondFunction(param)());

бинго?

atanov 17.03.2020 15:29

destus, не, так тоже не срабатывает. Если без возврата анонимной функции, то всё замечательно работает, а вот с анонимной никак. А нужно, для передачи аргумента...

atanov 17.03.2020 15:51

Похоже это у меня баг, вот этот пример работает нормально:

let myPromise = new Promise
(
	(resolve, reject) => 
	{
		let a = firstFunction(3000000000)();
		console.log(a);
	  	resolve();
	}
);
myPromise.then(secondFunction(25));

function firstFunction(param)
{
	return () =>
	{
		let i;
		for(i = 0; i < param; i++)
		{
		}
		return i;
	}
}
function secondFunction(param)
{
	return () =>
	{
		console.log(param);
	}
}

SuperZen 17.03.2020 16:21

function one(value) {
    console.log(value)
  }

  new Promise((res, rej) => {
    res('supervalue')
  })
    .then(one) // здесь one это ссылка на ф-цию 
    // это можно переписать по другому .then(valueFromPromise => one(valueFromPromise))


или еще вариант, ) не понятен смысл зачем это надо...
function one(value) {
  console.log('one', value)
  return Promise.resolve(value)
}

function anonymous(twentyFive, value) {
  return new Promise((res, rej) => {
    res(() => {
      console.log('anonymous', twentyFive, value)
    })
  })
}

async function job() {
  const anonymousInstance = await new Promise((res, rej) => {
    res('supervalue')
  })
    .then(one) // здесь one это ссылка на ф-цию // supervalue
    // это можно переписать по другому .then(valueFromPromise => one(valueFromPromise))
    .then(anonymous.bind(null, 25)) // curring - вроде бы %)
    .then(anonymousFoo => anonymousFoo())
}

job()


function one(value) {
  console.log('one', value)
  return Promise.resolve(value)
}

function anonymous(twentyFive) {
  return value => {
    console.log('anonymous', twentyFive, value)
  }
}

new Promise((res, rej) => {
  res('supervalue')
})
  .then(one) // здесь one это ссылка на ф-цию // supervalue
  // это можно переписать по другому .then(valueFromPromise => one(valueFromPromise))
  .then(anonymous.bind(null, 25)()) // curring - вроде бы %)


function one(value) {
  console.log('one', value)
  return Promise.resolve(value)
}

function anonymous(twentyFive) {
  return value => {
    console.log('anonymous', twentyFive, value)
  }
}

new Promise((res, rej) => {
  res('supervalue')
})
  .then(one)
  .then(anonymous.call(null, 25))

atanov 23.03.2020 15:39

SuperZen,
да не, всё ок с промисами, просто у меня "руки не из того места...":cray:


Часовой пояс GMT +3, время: 15:03.