Сдерживающие функторы как переменные

На самом деле это довольно просто, если вы планируете использовать async/await. Идея в том, чтобы отправить свой JSON Synchronously.

  1. Разделить полезную нагрузку
  2. Синхронно ожидать, пока ваш сервер не даст ему ответ
  3. Обработать ответ (продолжить отклонение, если произойдет ошибка, это нарушит цикл)
  4. [116 ] Продолжить изменение индекса

Не проверял код, но, более или менее, он должен быть таким.

const x = [{...}] // assuming that x is your array of object

const sendByChunks = async (chunkSize) => {
  return new Promise((resolve, reject) => {
    let start = 0
    let end = 0

    while (start <= x.length) {
      try {
        end = (end + chunkSize) > x.length ? x.length : (end + chunkSize) // set the end index
        const payload = x.slice(start, end) // slice the array
        start = end
        await postBatchData(payload) // send to your API
      } catch (error) {
        reject(`Error postBatchData from ${start} to ${end}`) // log something
      }
      resolve('Success')
    }
  })
}
sendByChunks(100)
  .then(response => { // handle response (your resolve) })
  .catch(error => { // handle error (your reject) })
6
задан Toji 23 January 2009 в 20:00
поделиться

3 ответа

template<class MyFunctor> MyMethod(MyFunctor f) {
    boost::function<void()> g = f;
    g();
}

Тип Вы передаете boost::function функциональный тип. Например, int(bool, char) тип интервала возврата функции и взятия bool и символа. Тем не менее, если Вы хотите создать shared_ptr сразу же, Вы не должны хранить функтор где-нибудь (boost::function требует new оператор для этого, даже при том, что для очень маленьких функторов, это будет использовать специальные приемы, чтобы только использовать выделение стека (маленькая буферная оптимизация)):

template<class MyFunctor> MyMethod(MyFunctor f) {
    boost::shared_ptr<T> ptr(new T, f);
}

повышение:: функция является частью tr1 и будет часть следующего официального Стандарта C++. Пример:

struct Manager {
    template<typename Deleter>
    Manager(Deleter d) 
        :deleter(d) {

    }

    boost::shared_ptr<Resource> allocate() {
        ...
        return boost::shared_ptr<Resource>(resource, deleter);
    }

private:
    boost::function<void(Resource *)> deleter;
};
8
ответ дан 9 December 2019 в 22:41
поделиться

Существует два пути, оба из который biol вниз к шаблонной обработке класса.

template <MyFunctor>
class MyClass
{
   MyFunctor   func;
  public:
    MyClass(MyFunctor f) :func(f)
    { }


    MyMethod() 
   {
       func();
   }
}

Это потребовало бы, чтобы Вы знали тип функтора. Чтобы избежать, чтобы, мы могли использовать фабрику:

 template<MyFunctor>
 MyClass<MyFunctor>  MakeFunctorClass(MyFunctor f)
 {     
     return MyClass<MyFunctor>(f);       
 }

Поочередно, с тех пор по всей вероятности, большая часть подписи функтора будет тем же только с изменением небольшой части, мы могли использовать это:

template <MyType>
class MyClass
{
   typedef std::binary_function<MyType, MyType, bool>  MyFunctor;
   MyFunctor func;
  public:


    MyMethod(MyFunctor f) 
   {
       func = f;
       func();
   }
}

Это делает использование немного более простым:

 bool AreEqual(int, int); 
 MyClass<int> myc;
 myc.MyMethod(AreEqual);

в дорогом из более хитрого определения (т.е. я не гарантирую, что binary_function определение типа дал, будет работать),

3
ответ дан 9 December 2019 в 22:41
поделиться

Не уверенный, если это помогло бы, но знало бы что повышение:: shared_ptr имеет переопределения конструктора, которые позволяют пользователю включать пользовательское освобождение (и пользовательское средство выделения, при желании). Это могло бы быть достаточно для того, в чем Вы нуждаетесь (это разработано, имея это в виду, если я читаю Ваш пример использования правильно).

0
ответ дан 9 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: