Обработка обратных вызовов

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

UploadImage(req, res) {
User.findOne({ _id: req.user._id })
.then((user) => {
    if (user) {
        if (user.images.type.length <= 4) {
            cloudinary.uploader.upload(req.body.image, async result => {
                user.image.type.push({ imgId: result.public_id, imgVersion: result.version });
                user.save()
                    .then(res.status(HttpStatus.OK).json({ message: 'Image uploaded successfully' }))
                    .catch(); //use callback inside save() or use it like promise
            });

        }
    } else { res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error uploading image' }); }
})
.catch(err => res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ message: 'Error uploading image' }));

}

, сделав это так, вы можете достичь того, что вы ищете .. ура :))

5
задан Binarian 30 May 2014 в 17:22
поделиться

3 ответа

Это - то, для чего селектор Objective C: http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/NSInvocationOperation_Class

API не очень интуитивен, но его штраф, после того как Вы понимаете это

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

0
ответ дан 13 December 2019 в 05:44
поделиться

Обычно обратные вызовы в Objective C обрабатываются путем передачи объекта делегата и селектора для выполнения на том делегате. Например, этот метод назовет метод на своем делегате после входа сообщения, передавая и его и сообщение, которое было зарегистрировано.

- (void)logMessage:(NSString *)message
          delegate:(id)delegate
    didLogSelector:(SEL)didLogSelector
{
    NSLog(@"%@", message);

    if (delegate && didLogSelector && [delegate respondsToSelector:didLogSelector]) {
        (void) [delegate performSelector:didLogSelector
                              withObject:self
                              withObject:message];
    }
}

Вы могли бы назвать его в коде как это:

- (void)sayHello
{
    [logger logMessage:@"Hello, world"
              delegate:self
        didLogSelector:@selector(messageLogger:didLogMessage:)];
}

- (void)messageLogger:(id)logger
        didLogMessage:(NSString *)message
{
    NSLog(@"Message logger %@ logged message '%@'", logger, message);
}

Можно также использовать objc_msgSend() непосредственно вместо этого, хотя необходимо понять достаточно время выполнения Objective C для выбора, какой вариант использовать и как создать прототип и указатель функции, через который можно назвать его. (Это - механизм, которым отправляет сообщение, на самом деле реализованы в Objective C — что компилятор обычно генерирует вызовы к тому, для представления [] выражения.)

1
ответ дан 13 December 2019 в 05:44
поделиться

Ваши проблемы конкретно со стандартными программами обратного вызова IOKit? Проблема с определенным примером, который Вы дали, состоит в том, что IOServiceMatchingCallback берет только 2 параметра, не 3. Вам нужен Ваш RawDeviceAdded () и BulkTestDeviceAdded () функции обратного вызова, чтобы соответствовать прототипу IOServiceMatchingCallback и принять сам как первый параметр (refCon), не 3-е. Кроме того, необходимо передать в сам как предпоследний параметр IOServiceAddMatchingNotification () для пасования назад его Вам обратным вызовом.

Общепринятая методика для обработки C обратные вызовы в коде Objective C должна только иметь статическую функцию что вперед обратный вызов к Вашему экземпляру. Так, Ваш код обратного вызова в качестве примера был бы похож на это:

static RawDeviceAdded(void* refcon, io_iterator_t iterator)
{
    [(MyClass*)refcon rawDeviceAdded:iterator];
}

@implementation MyClass
- (void)setupCallbacks
{
    // ... all preceding setup snipped
    kr = IOServiceAddMatchingNotification(gNotifyPort,kIOFirstMatchNotification, matchingDict,RawDeviceAdded,(void*)self,&gRawAddedIter );
    // call the callback method once to 'arm' the iterator
    [self rawDeviceAdded:gRawAddedIterator];
}
- (void)rawDeviceAdded:(io_iterator_t)iterator
{
    // take care of the iterator here, making sure to complete iteration to re-arm it
}
@end
11
ответ дан 13 December 2019 в 05:44
поделиться