JavaScript 链接承诺:在上一个承诺完成之前调用下一个承诺
JavaScript Chaining Promises : Calling next promise before previous has finished
工具:JavaScriptES6
关于链接多个承诺以按顺序执行的语法,我还没有看到一个好的简洁答案。我认为这对于所有有前途的新手来说都是解决棺材问题的好办法。 :)
我的问题是我想以同步顺序调用它getPosts--->getThreads--->initializeComplete()
这是我正在做的。
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
- userPromise是我从另一部分代码返回的Promise obj
- getPostsPromise returns 一个 Promise 并向服务器获取帖子
- getThreadsPromise returns 一个 Promise 并为线程获取服务器
- initializeComplete 是一个回调,告诉我的程序它已初始化。
以下是链中承诺之一的示例:
var getPostsPromise = function(){
//Firebase is just a simple server I'm using
var firebasePostsRef = new Firebase("https://myfburl.firebaseio.com/posts");
var postsRef = firebasePostsRef.child(localPlace.key);
return new Promise(function(resolve, reject) {
//Below is a Firebase listener that is called when data is returned
postsRef.once('value', function(snap,prevChild) {
var posts = snap.val();
AnotherFile.receiveAllPosts(posts);
resolve(posts);
});
});
}
但是 initializeComplete()
在 getPostsPromise
之前被调用并且 getThreadsPromise
有机会完成提取。
为什么会这样?我该如何编写承诺以按顺序执行?
initializeComplete 立即被调用,因为您在将它传递给 then
时正在调用它。您必须省略括号,就像您对 getPostsPromise
和 getThreadsPromise
所做的一样
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);
虽然 yts 的回答是正确的(问题是您调用的是 initializeComplete 而不是传递函数),但我宁愿以不同的方式设置调用格式。让每个回调函数调用下一个函数有点违背承诺的设计。我宁愿每个函数 return 一个承诺,然后在 returned 承诺上调用 then
:
userPromise
.then(function(){
return getPostsPromise()
}).then(function(){
return getThreadsPromise()
}).then(function(){
return initializeComplete();
});
或传递实际的 returned 对象而不必进行任何额外的中间处理:
userPromise
.then(getPostsPromise)
.then(getThreadsPromise)
.then(initializeComplete);
工具:JavaScriptES6
关于链接多个承诺以按顺序执行的语法,我还没有看到一个好的简洁答案。我认为这对于所有有前途的新手来说都是解决棺材问题的好办法。 :)
我的问题是我想以同步顺序调用它getPosts--->getThreads--->initializeComplete()
这是我正在做的。
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
- userPromise是我从另一部分代码返回的Promise obj
- getPostsPromise returns 一个 Promise 并向服务器获取帖子
- getThreadsPromise returns 一个 Promise 并为线程获取服务器
- initializeComplete 是一个回调,告诉我的程序它已初始化。
以下是链中承诺之一的示例:
var getPostsPromise = function(){
//Firebase is just a simple server I'm using
var firebasePostsRef = new Firebase("https://myfburl.firebaseio.com/posts");
var postsRef = firebasePostsRef.child(localPlace.key);
return new Promise(function(resolve, reject) {
//Below is a Firebase listener that is called when data is returned
postsRef.once('value', function(snap,prevChild) {
var posts = snap.val();
AnotherFile.receiveAllPosts(posts);
resolve(posts);
});
});
}
但是 initializeComplete()
在 getPostsPromise
之前被调用并且 getThreadsPromise
有机会完成提取。
为什么会这样?我该如何编写承诺以按顺序执行?
initializeComplete 立即被调用,因为您在将它传递给 then
时正在调用它。您必须省略括号,就像您对 getPostsPromise
和 getThreadsPromise
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);
虽然 yts 的回答是正确的(问题是您调用的是 initializeComplete 而不是传递函数),但我宁愿以不同的方式设置调用格式。让每个回调函数调用下一个函数有点违背承诺的设计。我宁愿每个函数 return 一个承诺,然后在 returned 承诺上调用 then
:
userPromise
.then(function(){
return getPostsPromise()
}).then(function(){
return getThreadsPromise()
}).then(function(){
return initializeComplete();
});
或传递实际的 returned 对象而不必进行任何额外的中间处理:
userPromise
.then(getPostsPromise)
.then(getThreadsPromise)
.then(initializeComplete);