如何在執行下一行代碼之前等待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;
如何在執行下一行代碼之前等待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;
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我一段時間來回繞這種編程異步方式我的頭 - 但一旦我做事情的工作相當不錯。
您可以開始顯示加載GIF,那麼你可以訂閱didLoad
事件備案,裏面你可以繼續你的實際處理..
record = App.User.find(1);
//show gif..
record.on("didLoad", function() {
console.log("ren loaded!");
});
//end gif; continue processing..
不幸的是,你認爲我在某種觀點上工作,我不是。 – TrevTheDev
如果您在控制器中工作,則可以發送視圖可以處理的自定義事件並實現上述功能。看到'Ember.Evented'爲相同:http://stackoverflow.com/questions/15991871/ember-js-how-to-trigger-view-method-from-controller – jacquard
我的問題仍然是如何暫停我的代碼,直到承諾已解決。 – TrevTheDev
很好的問題。試圖解決這個問題。很煩人。看起來承諾對於'觀點'來說很好,但對於面向對象編程來說卻很糟糕。你找到一個解決方案? – andy