如何在.then内部传递JS函数的参数,或实现类似行为?

时间:2018-09-24 14:47:06

标签: javascript asynchronous promise

我们假设有一个诺言 createPost 和一个函数 getPosts 。第一个在帖子数据库中创建一个摘要并进行解析。
getPosts 检索所有帖子,创建一个UL列表并将其附加到网页上。

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

按上述方式调用createPost时,promise会一直等到更新帖子并运行-then- getPosts 。但是,如果由于某种原因,我想解决问题,然后使用参数 getPosts(param)运行 getPosts ,它会在promise解决之前立即被触发。

.then回调函数如何(以及为什么)如何包含一个参数,而又不违反诺言?或者,如何实现这种行为?

编辑:为什么,那

.then(getPosts(param));

不等待函数解析,

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

是吗?

4 个答案:

答案 0 :(得分:3)

创建一个执行所需功能的函数。像这样:

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

此代码将一直等待,直到createPost的诺言得以解决为止,这时它将调用getPosts,并传入paramcreatePost的结果。

或者,如果您根本不关心结果,只是createPost已经完成,则可以执行以下操作:

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

答案 1 :(得分:2)

关于根本问题。说你有:

function f() {
    return 'hello';
}

then()以函数作为参数。因此,说then(f)表示“在诺言解决之后调用f。如果您说then(f()),那么您的意思是”将调用f(即'hello')的结果传递给那时”。 f立即被调用。

还请注意,顺便提一下,传递给 的函数将使用单个参数调用,即附加了then的promise的解析度。例如:

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))

最后一个公式定义了一个函数(未命名),该函数在调用时(尚未调用)将使用params调用getPosts。当我们将那个未命名的函数传递给那时时,我们的意思是,“当诺言得到解决时,调用这个未命名的函数,这个未命名的函数将调用getPosts”。

答案 2 :(得分:1)

添加包装内联函数。

createPost ({*post contents JSON*})
    .then(()=>{getPosts(param1, param2)})

答案 3 :(得分:1)

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

执行此操作时,您将在那一刻执行getPosts方法,并将其返回值作为参数传递给then方法。如果您改为这样做

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

您正在等待承诺解决,并在解决承诺后执行getPosts。