2014-01-28 103 views
10

如何在執行下一行代碼之前等待Promise解決?如何在繼續之前等待承諾履行

例如

var option = null; 
if(mustHaveOption){ 
    option = store.find("option", 1).then(function(option){ return option }) 
} 
//wait until promise is resolved before returning this value 
return option; 
+0

很好的問題。試圖解決這個問題。很煩人。看起來承諾對於'觀點'來說很好,但對於面向對象編程來說卻很糟糕。你找到一個解決方案? – andy

回答

5

rallrall提供的正確答案在他的評論:你不能

我的解決方案是重新設計我的代碼返回承諾,然後接收函數必須評估結果的東西沿線:

function a(){ 
    var option = null; 
    return mustHaveOption ? store.find("option", 1) : false; 
    }  
} 

function b(){ 
    res = a(); 
    if (!res){ 
     res.then(function(option){ 
      // see option here 
     }); 
    } 
} 

另一個關鍵的解決方案是使用hash of promises。一個創建所有必須執行下一個代碼之前要解決的承諾的數組:

Em.RSVP.Promise.all(arrayOfPromises).then(function(results){ 
    //code that must be executed only after all of the promises in arrayOfPromises is resolved 
}); 

這tooks我一段時間來回繞這種編程異步方式我的頭 - 但一旦我做事情的工作相當不錯。

0

您可以開始顯示加載GIF,那麼你可以訂閱didLoad事件備案,裏面你可以繼續你的實際處理..

record = App.User.find(1); 

    //show gif.. 

    record.on("didLoad", function() { 
     console.log("ren loaded!"); 
    }); 

    //end gif; continue processing.. 
+0

不幸的是,你認爲我在某種觀點上工作,我不是。 – TrevTheDev

+0

如果您在控制器中工作,則可以發送視圖可以處理的自定義事件並實現上述功能。看到'Ember.Evented'爲相同:http://stackoverflow.com/questions/15991871/ember-js-how-to-trigger-view-method-from-controller – jacquard

+0

我的問題仍然是如何暫停我的代碼,直到承諾已解決。 – TrevTheDev

相關問題