2015-11-25 4 views
1

Мне было интересно, могу ли я использовать обещания с помощью таймера обратного отсчета. Мой код выглядит примерно так:Обещают только асинхронные операции?

function countdown(duration, callback) { 
    ... 
} 

function sayHi() { 
    console.log('hi'); 
} 

и я называю это делать что-то вроде

countdown(15, sayHi); 

Есть ли способ, что я мог сделать это вместо этого?

countdown(15).then(sayHi); 

Here является JSFiddle моего текущего кода.

+2

Это была бы асинхронная операция, не так ли. ? –

+0

Google о обещаниях, тогда вы сможете ответить на свой вопрос. –

+0

Действительно ли это? Весь код внутри моей функции «обратный отсчет» является синхронным, [это] (http://jsfiddle.net/amhLwqd4/1/) - это то, что сейчас выглядит. В основном я просто вызываю обратный вызов вручную. – saadq

ответ

2

Да, обещания - это способ «скрыть» обратные вызовы. Для примера, вы можете использовать обещание, как это:

function countdown(duration) { 
    return new Promise(function (resolve, reject) { 
     // wait for duration and resolve 
     setTimeout(function() { 
      resolve(); 
     }, duration); 
    }); 
} 

function sayHi() { 
    console.log('hi'); 
} 

countdown(1000).then(sayHi); 
+0

Не все обратные вызовы могут быть скрыты с помощью обещаний. – Bergi

+0

У вас есть пример? Вместо передачи обратного вызова в качестве аргумента он переходит в 'then()', и никакие другие изменения не нужны. – Shanoor

+1

[Много примеров] (http://stackoverflow.com/a/21884813/1048572), на самом деле :-) Ваш код в порядке, я просто не согласен с общими утверждениями «* обещания - это способ« скрыть »обратные вызовы *». – Bergi

0

да вы можете resolve их собственные конкретные затворы времени like.use уйти от плохого ответа от нескольких вызовов одновременно.

function countdown(duration, callback) { 
var deferred = Promise.defer(); 
    (function(duration,deferred){setTimeout(function(){ 
     deferred.resolve(); 
    },duration); 
    })(duration,deferred); 
} 

Предыдущая из них устарела.

function countdown(duration, callback) { 
    return new Promise(function (resolve, reject) { 
      setTimeout(function() { 
       resolve(); 
      }, duration); 
     }); 


} 
+0

Нет функции 'Promise.defer'. – Bergi

+0

посмотреть @Bergi https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred – ngLover

+0

Это не обещания ES6. Второе предложение на странице, которую вы связываете, является уведомлением об устаревании. – Bergi

0
function countdown(duration) { 
    return new Promise(function(resolve, reject) { 
    var interval = setInterval(function() { 
     console.log(duration--); 
     if (!duration) { 
     clearInterval(interval); 
     resolve(); 
     } 
    }, 1000); 
    }); 
} 
countdown(15).then(function() { console.log("DONE"); }); 
+0

. Более разумно обещать «setTimeout» и использовать это как асинхронный примитив. Использование 'console.log' внутри' setInterval', как и вы, не дает вам никаких преимуществ обещаний. – Bergi

+0

@Bergi: Обещание - это конец обратного отсчета, точно так же, как кажется, на посту OP. «Console.log» имитирует обновления пользовательского интерфейса, которые будут выполняться в течение всего обратного отсчета. Думаю, я буквально «обратил отсчет». – Amadan

+0

Да, но если вы используете обещания, вы также должны делать обновления пользовательского интерфейса из обещаний :-) – Bergi

2

Обещание подходит для любой операции, которая не обязательно будет бежать немедленно.

Javascript является однопоточным. Поэтому, если вы вызываете функцию, она обязательно будет запускаться немедленно в том же потоке. Обещание - удобный способ запустить код через некоторое время (все еще в том же потоке, но как часть другого обработчика событий).

Так что в случае таймаута, когда обратный вызов следует называть позже, использование обещания - хорошая идея.

И если вы не уверены в том, следует ли использовать обещание или простой обратный вызов, обе служат более или менее той же целью, но обещания обычно делают код более удобочитаемым.

ES7 async-await еще более удобочитаемо!

+0

Спасибо за объяснение! Дал тебе верх. Также спасибо за ссылку на асинхронное ожидание, которое выглядит довольно круто – saadq

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