2014-01-28 3 views
10

Как я могу подождать, пока обещание будет разрешено до выполнения следующей строки кода?Как ждать выполнения обещания перед продолжением

например.

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

большой вопрос. Попытка разобраться в этом. Довольно раздражает. Кажется, обещания отлично подходят для «взглядов», но довольно дрянных для программирования OO. Вы нашли решение? – 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 
}); 

Это Наталья принимает меня некоторое время, чтобы обернуть мою голову вокруг этого асинхронного способа программирования - но как только я сделал это работает довольно хорошо.

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

Смежные вопросы