我们假设有一个诺言 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));
是吗?
答案 0 :(得分:3)
创建一个执行所需功能的函数。像这样:
createPost ({*post contents JSON*})
.then(result => getPosts(param, result));
此代码将一直等待,直到createPost
的诺言得以解决为止,这时它将调用getPosts,并传入param
和createPost
的结果。
或者,如果您根本不关心结果,只是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。