Как отложить выполнение функции? - PullRequest
0 голосов
/ 06 июля 2018

Скажем, у меня есть Javascript API, который состоит из двух функций, первая из которых выполняет некоторую асинхронную работу перед вызовом обратного вызова:

function api1(args, callback) {
   some_async_op(function() {
       callback()
   })
}
function api2(arg) {
   ...
}

Важно, чтобы api2 разрешалось выполнять свою работу только после того, как api1 завершил асинхронную работу и вызвал ее обратный вызов. Однако случается так, что клиентские вызовы к этим apis, как правило, синхронны, то есть

api1(arg, function() { ... })
...
api2(arg)

Как можно реализовать api2(), чтобы он не мог работать, пока не завершится api1()? Очевидно, что вызов api2() может быть помещен в обратный вызов, переданный api1(), но я ищу альтернативу.

1 Ответ

0 голосов
/ 06 июля 2018

Кажется, что асинхронное программирование настолько распространено в javascript, что можно ожидать, что пользователи просто будут использовать обещание, возвращаемое api1, или иметь api2 доступным только в качестве метода для объекта, возвращаемого api1 асинхронно.

Я не решаюсь опубликовать это, потому что это кажется хакерским, но, возможно, это вдохновит на что-то полезное Вы можете сделать что-нибудь, где api1 и api2 поделятся обещанием. Это заставляет основную функциональность api2 в then() в обещании. Это может быть ужасно, если вам нужно сделать более одного независимого вызова пары функций.

const some_async_op = cb => setTimeout(cb, 500)

let resolver, p

function api1(cb) {
  if (!p) p = new Promise(resolve => {
    resolver = resolve
  })
  some_async_op(() => {
    cb()
    resolver()
  })
}

function api2() {
  (p || (p = new Promise(resolve => {
    resolver = resolve
  })))
  .then(() => console.log('api 2 done'))
}

// call api2 first
api2()
// sometime later call api1
setTimeout(() => api1(() => console.log('api1 callback fired'), 600))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...