Как передать параметр для JS-функции внутри .then или добиться аналогичного поведения? - PullRequest
0 голосов
/ 24 сентября 2018

Давайте предположим, что есть обещание createPost и функция getPosts .Первый создает записанные в базе данных сообщения и обрабатывает их.
getPosts извлекает все сообщения, создает списки UL и добавляет их на веб-страницу.

 createPost ({*post contents JSON*})
 .then(getPosts);

Когда createPostВызывается, как указано выше, обещание ждет, пока сообщения не будут обновлены и не будет запущен getPosts .Однако, если по какой-то причине я хочу разрешить и запустить getPosts с параметром: getPosts (param) , он сразу же запускается, прежде чем обещание разрешается.

Как (и почему ), может ли функция обратного вызова .then содержать параметр, не нарушая обещание?Или, как я могу добиться этого поведения?

РЕДАКТИРОВАТЬ: Почему , что, хотя

.then(getPosts(param));

не ждет разрешения функции,

.then(() => getPosts(param));

делает?

Ответы [ 4 ]

0 голосов
/ 24 сентября 2018

По корневому вопросу.Скажем, у вас есть:

function f() {
    return 'hello';
}

then() принимает функцию в качестве параметра.Таким образом, выражение then(f) говорит: «вызовите f после разрешения обещания. Если вы скажете then(f()), то, что вы говорите:« передайте результат вызова f (что означает «привет») для then ».f вызывается сразу.

Кроме того, обратите внимание, что, кстати, функция, которую вы передаете затем , будет вызываться с одним параметром, а именно с разрешением обещания, для которого thenприлагается.Например:

someAsyncFn() {
    /* return a promise that resolves to "foo!!" */
}

someAsyncFn().then(console.log);  // this will log foo!!

Хотя, вероятно, плохой стиль, это означает, что вы можете сказать ...

createPost().then(() => param).then(getPosts);

РЕДАКТИРОВАТЬ

Еще несколько словкогда запускается функция ...

// nothing gets invoked when we define a function
function foo() {
    return 'bar';
}

let a = foo;  // this doesn't invoke foo.  a is now a function

let b = foo();   // this *does* invoke foo, b is now 'bar'

let c = () => 'bar';  // the same as defining a function. it doesn't invoke anything

let d = c;  // this doesn't invoke c.  d is now a function

let e = c();  // this *does* invoke c, e is now 'bar'

Используя все это, когда мы говорим

.then(getPosts)  // this doesn't invoke getPosts

.then(getPosts(params))  // this invokes getPosts and passes the result to then

.then(() => getPosts(params))

Эта последняя формулировка определяет функцию (без имени), которая при вызове (которая еще не) вызовет getPosts с параметрами.Когда мы передаем эту безымянную функцию тогда, мы говорим: «Когда обещание разрешено, вызовите эту безымянную функцию, и эта безымянная функция вызовет getPosts»

0 голосов
/ 24 сентября 2018

Добавить встроенную функцию оболочки.

createPost ({*post contents JSON*})
    .then(()=>{getPosts(param1, param2)})
0 голосов
/ 24 сентября 2018
createPost ({*post contents JSON*})
 .then(getPosts(param));

Когда вы делаете это, вы выполняете метод getPosts в этот момент и передаете его возвращаемое значение в качестве параметра методу then.Если вы сделаете это вместо

createPost ({*post contents JSON*})
    .then(function () {
        getPosts(param);
    });

Вы ожидаете разрешения обещания и выполняете getPosts после разрешения обещания.

0 голосов
/ 24 сентября 2018

Создайте функцию, которая делает то, что вы хотите.Примерно так:

createPost ({*post contents JSON*})
  .then(result => getPosts(param, result));

Этот код будет ждать до тех пор, пока не будет выполнено обещание createPost, когда он вызовет getPosts, передавая param, а также результат из createPost.

Или, если вас не волнует результат, просто, когда createPost завершил, вы можете сделать что-то вроде этого:

createPost ({*post contents JSON*})
  .then(() => getPosts(param));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...