2014-01-28 68 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

相关问题