JavaScript Chaining Promises:在上一个完成之前调用下一个promise

时间:2015-11-02 02:46:28

标签: javascript promise ecmascript-6 es6-promise

工具:JavaScript ES6

我还没有看到关于链接多个承诺按顺序执行的语法的简明扼要答案。我认为这对于所有承诺新手的棺材问题都是一个很好的指甲。 :)

我的问题是我想以同步顺序getPosts--->getThreads--->initializeComplete()

来调用它

这就是我在做什么。

userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete());
  • userPromise 是Promise obj我从代码的其他部分返回
  • getPostsPromise 会返回一个Promise并向服务器提取帖子
  • getThreadsPromise 返回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有机会完成抓取。

为什么会发生这种情况?如何编写承诺以按顺序执行?

2 个答案:

答案 0 :(得分:7)

initializeComplete正在立即调用,因为在将其传递给then时正在调用它。您必须省略括号,就像您对getPostsPromisegetThreadsPromise

所做的那样
userPromise.then(getPostsPromise).then(getThreadsPromise).then(initializeComplete);

答案 1 :(得分:4)

虽然yts的答案是正确的(问题是你正在调用initializeComplete而不是传递函数),我宁愿格式化调用有点不同。让每个回调函数调用下一个函数有点违背promises的设计。我宁愿每个函数返回一个promise,然后在返回的promise上调用then

userPromise
.then(function(){
  return getPostsPromise()
}).then(function(){
  return getThreadsPromise()
}).then(function(){
  return initializeComplete();
});

或传递实际返回的对象,而不必进行任何额外的中间处理:

userPromise
.then(getPostsPromise)
.then(getThreadsPromise)
.then(initializeComplete);