在Promise结束之前避免函数返回

时间:2014-03-06 11:32:08

标签: javascript promise

在函数内部我有类似的东西

function() {
var User = new Models.CommerceUser();
var userPromise = User.fetch();
userPromise
    .done(function() {
        console.log('user fetched')
        var CommerceCollection = new Models.CommerceCollection();
        var commercePromise = CommerceCollection.fetch({
            data: {
                noCursor: true
            }
        });
        commercePromise
            .done(function() {
                console.log('commerces fetched')
                var ActiveOffersCollection = new Models.ActiveOffersCollection();
                var activeOffersPromise = ActiveOffersCollection.fetch();
                activeOffersPromise
                    .done(function() {
                        console.log('activeOffers fetched')
                        initVariables();
                    })
                    .error(function() {
                        console.error('Error while getting commerces')
                    });

            })
            .error(function() {
                console.error('Error while getting commerce')
            })
    })
 return result;
  }

我不希望在所有回调完成之前返回,但我真的不知道该怎么做。

对于那些提出要求的人......这些是骨干模型,这就是我承诺的原因:)

提前致谢

1 个答案:

答案 0 :(得分:1)

您没有选择这样做。您调用的操作是异步的,因此如果您自己的代码依赖于它们的结果,则它无法以同步方式工作。

不考虑return result(这样做了什么?在任何地方都没有定义result!),您应该将代码重组为管道。从函数的内容开始:

userPromise
.done(function() {
    console.log('user fetched')
    var CommerceCollection = new Models.CommerceCollection();
    var commercePromise = CommerceCollection.fetch({
        data: {
            noCursor: true
        }
    });
    commercePromise
        .done(function() {
            console.log('commerces fetched')
            var ActiveOffersCollection = new Models.ActiveOffersCollection();
            var activeOffersPromise = ActiveOffersCollection.fetch();
            activeOffersPromise
                .done(function() {
                    console.log('activeOffers fetched')
                    initVariables();
                })
                .error(function() {
                    console.error('Error while getting commerces')
                });

        })
        .error(function() {
            console.error('Error while getting commerce')
        })
})

而不是等待每个承诺完成然后安排下一步(这里有三个级别),用then组成管道:

// error checking elided
return new Models.CommerceUser().fetch()
   .then(function() { return new Models.CommerceCollection().fetch(...); })
   .then(function() { return new Models.ActiveOffersCollection.fetch(...); })
   .then(initVariables);

从你的函数和更多的链代码返回新的组合承诺。