2014-03-06 45 views
0

函數裏面我有這樣的事情避免功能的承諾之前返回結束

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; 
    } 

我不希望所有的回調已經完成前返回,但我真的不知道該怎麼做。

對於那些誰是問......這些都是骨幹機型,這就是爲什麼我有諾言:)

在此先感謝

+0

在'.done'函數內使用'return'? – Chris

+0

但是,這將無法正常工作......它會返回內部函數,但是大的函數會在 –

+0

之前完成我對promise很陌生,但是沒有使用'then'來解決問題? –

回答

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

從你的函數返回新的合成的承諾,並進一步鏈代碼。