Bluebird agreement.method для обертывания функции возвращает обещание, это нормально?

с использованием bluebird в моем коде, и я использую метод prom.method, чтобы покрыть оригинальные функции так же, как api say.Then я пишу функцию, которая возвращает обещание, и используйте метод prom.method для его покрытия. Эти две функции возвращают то же самое:

function () {
    var ret = new Promise(INTERNAL);
    ret._captureStackTrace();
    ret._pushContext();
    var value = tryCatch(fn).apply(this, arguments);
    ret._popContext();
    ret._resolveFromSyncValue(value);
    return ret;
}

Можно ли использовать функцию prom.me для покрытия функции возврата обещания?

Ответ 1

Построение асинхронных API с ошибками

Да, точка Promise.method заключается в том, чтобы сделать методы безопасными - например, если у вас есть метод, который выглядит так:

function foo(jsonStr){
    var obj = JSON.parse(jsonStr);
    return getApi(obj.endpoint);
}

Может быть throw ошибка, если передана недопустимый объект, поэтому, если вы передадите ей недопустимую строку, она будет метать (а не отклонять). Это означает, что вы должны защищать как отброшенные ошибки, так и отклоненные promises в своем коде и добавлять в свой код } catch(e){ и .catch(function(e){.

Эта форма программирования создает слабый и хрупкий API, который отличает синхронные и асинхронные ошибки и может (и будет) создавать условия гонки, основанные на ошибках. Если функция может делать что-то асинхронно, она всегда должна делать это асинхронно. Это основная концепция разработки асинхронных API-интерфейсов - в противном случае вы столкнетесь с условиями гонки и другими проблемами.

Что Promise.method делает

Promise.method в основном обертывает ваш метод с помощью try/catch и преобразует брошенные ошибки в отклонения и возвращает значения для выполнения. Если ваш function foo был Promise.method, он всегда отказывался бы от ошибок, а не отбрасывания. Это устраняет проблему состояния гонки, так как ваши методы теперь всегда терпят неудачу одинаково.

var foo = Promise.method(function(jsonStr){
    var obj = JSON.parse(jsonStr); // if this throws - you get a rejection
    return getApi(obj.endpoint);
});

Если не использовать его

Есть случаи, когда вы можете избежать использования Promise.method - например, когда тело вашего метода находится в цепочке обещаний или вы на 100% уверены, что оно не будет выбрано. В общем, я нахожу Promise.method весьма полезным.

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

Итак, следует ли обертывать функции, возвращающие с ним promises?

В общем - да. Исключения применяются и YMMV.